{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### MNIST: the \"Hello World\" of Machine Learning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Alternative local file loader (due to mldata.org being down)\n",
    "\n",
    "from scipy.io import loadmat\n",
    "mnist_raw = loadmat(\"mnist-original.mat\")\n",
    "mnist = {\n",
    "    \"data\": mnist_raw[\"data\"].T,\n",
    "    \"target\": mnist_raw[\"label\"][0],\n",
    "    \"COL_NAMES\": [\"label\", \"data\"],\n",
    "    \"DESCR\": \"mldata.org dataset: mnist-original\",\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'COL_NAMES': ['label', 'data'],\n",
       " 'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ..., \n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8),\n",
       " 'target': array([ 0.,  0.,  0., ...,  9.,  9.,  9.])}"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 70K images, 28x28 pixels/image, each pixel = 0 (white) to 255 (black)\n",
    "mnist # a dict object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((70000, 784), (70000,))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# take a peek\n",
    "X,y = mnist['data'], mnist['target']\n",
    "\n",
    "X.shape, y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAABj5JREFUeJzt3a9rlf8fxvEzGQZZGLo0hA3BWQzivzHEpha1mRRhGkyW\nFUG0WQXFpEFENC6IQWxD0xB/40A4gpyyoJ5P+ZZvuF/3PGdnc+d6POrlvfuAPrnD2/tsot/vd4A8\ne3b6AwA7Q/wQSvwQSvwQSvwQSvwQSvwQSvwQSvwQanKb7+e/E8LoTWzmD3nyQyjxQyjxQyjxQyjx\nQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjx\nQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQyjxQ6jJnf4AMKiHDx+W+5s3\nbxq3+/fvb/XH+T+fPn0a6c/fCp78EEr8EEr8EEr8EEr8EEr8EEr8EMo5PyPV6/Uat5cvX5bXLi8v\nl/urV6/KfWJiotzTefJDKPFDKPFDKPFDKPFDKPFDKEd9Y+7Xr1/lvr6+PtTPbzuO+/DhQ+O2srIy\n1L1HaWZmptzPnDmzTZ9kdDz5IZT4IZT4IZT4IZT4IZT4IZT4IZRz/jHXdo4/Pz9f7v1+v9z/5ddm\njx071ridPXu2vHZxcbHcDx8+PNBn+pd48kMo8UMo8UMo8UMo8UMo8UMo8UMo5/xj7urVq+Xedo7f\ntreZnZ1t3C5cuFBee/369aHuTc2TH0KJH0KJH0KJH0KJH0KJH0KJH0I55x8Dd+/ebdyeP39eXjvs\n+/ht13e73cat7XcKrK2tlfvCwkK5U/Pkh1Dih1Dih1Dih1Dih1Dih1Dih1ATw76v/Ze29WbjojrH\n73Q6naWlpcat1+sNde+d/N7+ubm5cn///v3I7r3LbeovxZMfQokfQokfQokfQokfQokfQjnq2wXa\njry+fv068M+enp4u96mpqXLfs6d+fmxsbDRu379/L69t8/v376GuH2OO+oBm4odQ4odQ4odQ4odQ\n4odQ4odQvrp7Fzh58mS537lzp3E7f/58ee3FixfL/fjx4+XeZn19vXFbXFwsr11dXR3q3tQ8+SGU\n+CGU+CGU+CGU+CGU+CGU+CGU9/kZqW/fvjVuw57z//nzZ6DPFMD7/EAz8UMo8UMo8UMo8UMo8UMo\n8UMo7/P/z5cvX8p93759jduBAwe2+uOMjeqsvu3Xe7ftT548Kfe270FI58kPocQPocQPocQPocQP\nocQPocQPoWLO+W/cuFHu9+7dK/e9e/c2bocOHSqvffz4cbnvZt1ut9yvXbvWuL19+7a8dn5+fpCP\nxCZ58kMo8UMo8UMo8UMo8UMo8UOomKO+169fl/va2trAP/vz58/lfuXKlXK/devWwPcetbZXnZ89\ne1bu1XHe5GT9z+/o0aPl7pXd4XjyQyjxQyjxQyjxQyjxQyjxQyjxQ6iYc/5Rmp6eLvd/+Ry/zeXL\nl8u97euzK7OzsyP72bTz5IdQ4odQ4odQ4odQ4odQ4odQ4odQMef8bV8DPTU1Ve69Xq9xO3HixCAf\naVucPn263B89elTu/X6/3Nt+jXbl5s2bA1/L8Dz5IZT4IZT4IZT4IZT4IZT4IZT4IVTMOf/t27fL\n/d27d+VefT/9xsZGeW3bWXqb5eXlcv/582fj9uPHj/LatnP6I0eOlPu5c+cG3vfv319ey2h58kMo\n8UMo8UMo8UMo8UMo8UOoibZXNrfYtt7sb6ysrJT70tJS41a97tvpdDofP34s91G+NruwsFDuMzMz\n5f7gwYNyn5ub++vPxMht6h+MJz+EEj+EEj+EEj+EEj+EEj+EEj+Ecs6/Sd1ut3Fre212dXW13F+8\neFHuT58+LfdLly41bqdOnSqvPXjwYLmzKznnB5qJH0KJH0KJH0KJH0KJH0KJH0I554fx45wfaCZ+\nCCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+\nCCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CCV+CDW5zfeb\n2Ob7AQ08+SGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU+CGU\n+CGU+CGU+CGU+CGU+CGU+CHUf5Zt+b+OQHReAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1ec21e12e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# display example image\n",
    "\n",
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "some_digit = X[36000]\n",
    "some_digit_image = some_digit.reshape(28, 28)\n",
    "\n",
    "plt.imshow(\n",
    "    some_digit_image, \n",
    "    cmap = matplotlib.cm.binary,\n",
    "    interpolation=\"nearest\")\n",
    "\n",
    "plt.axis(\"off\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# looks like a \"five\". What's the corresponding label?\n",
    "y[36000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 784) (10000, 784) (60000,) (10000,)\n"
     ]
    }
   ],
   "source": [
    "# dataset already split into training (1st 60K) & test (last 10K) images.\n",
    "# shuffle training set for cross-validation quality\n",
    "\n",
    "X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "shuffle_index = np.random.permutation(60000)\n",
    "X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]\n",
    "\n",
    "print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Binary classifier training - distinguish between 2 classes\n",
    "* Using Stochastic Descent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000,) [False False False ..., False False False]\n",
      "(10000,) [False False False ..., False False False]\n",
      "[ True]\n"
     ]
    }
   ],
   "source": [
    "# Start by only trying to ID \"five\" digits.\n",
    "\n",
    "y_train_5 = (y_train == 5) # create target vectors\n",
    "y_test_5  = (y_test == 5)\n",
    "\n",
    "print(y_train_5.shape, y_train_5)\n",
    "print(y_test_5.shape, y_test_5)\n",
    "\n",
    "# SGD classifier: good at handling large DBs\n",
    "#                 also good at handling one-at-a-time learning\n",
    "\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "sgd_clf = SGDClassifier(random_state=42)\n",
    "sgd_clf.fit(X_train, y_train_5)\n",
    "\n",
    "# did it correctly predict the \"five\" found above?\n",
    "print(sgd_clf.predict([some_digit]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Performance Measures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.96795  0.96975  0.96855]\n"
     ]
    }
   ],
   "source": [
    "# measure accuracy using K-fold (n=3) cross-validation scores\n",
    "\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "print(cross_val_score(\n",
    "        sgd_clf, \n",
    "        X_train, \n",
    "        y_train_5, \n",
    "        cv=3, \n",
    "        scoring=\"accuracy\"))\n",
    "\n",
    "# 90% accuracy = pretty easy when 90% of digits aren't fives to begin with ... :-|"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.96795\n",
      "0.96975\n",
      "0.96855\n"
     ]
    }
   ],
   "source": [
    "# rolling your own cross-validation. Results should be similar-ish to above.\n",
    "\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.base import clone\n",
    "\n",
    "skfolds = StratifiedKFold(n_splits=3, random_state=42)\n",
    "\n",
    "for train_index, test_index in skfolds.split(X_train, y_train_5):\n",
    "    \n",
    "    clone_clf = clone(sgd_clf)\n",
    "    \n",
    "    X_train_folds =  X_train[train_index]\n",
    "    y_train_folds = (y_train_5[train_index])\n",
    "    X_test_fold =    X_train[test_index]\n",
    "    y_test_fold =   (y_train_5[test_index])\n",
    "\n",
    "    clone_clf.fit(X_train_folds, y_train_folds)\n",
    "    \n",
    "    y_pred = clone_clf.predict(X_test_fold)\n",
    "    \n",
    "    n_correct = sum(y_pred == y_test_fold)\n",
    "    print(n_correct / len(y_pred)) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.9096   0.9124   0.90695]\n"
     ]
    }
   ],
   "source": [
    "# 95% accuracy sounds too good to be true. How about not-fives?\n",
    "\n",
    "from sklearn.base import BaseEstimator\n",
    "\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass\n",
    "\n",
    "    def predict(self, X):\n",
    "        return np.zeros((len(X), 1), dtype=bool)\n",
    "\n",
    "never_5_clf = Never5Classifier()\n",
    "\n",
    "print(cross_val_score(\n",
    "    never_5_clf,\n",
    "    X_train,\n",
    "    y_train_5,\n",
    "    cv=3,\n",
    "    scoring=\"accuracy\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# only ~10% of images are \"five\", so ~90% of images are \"not five\". \n",
    "# You SHOULD be right about 90% of the time. :-)\n",
    "\n",
    "# Lesson Learned:\n",
    "# Accuracy not a good metric for classifiers - esp those with skewed datasets."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Confusion Matrix - a better way of evaluating a classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[54044   535]\n",
      " [ 1340  4081]]\n"
     ]
    }
   ],
   "source": [
    "# general idea: count #times instances of A are classified as B.\n",
    "# first, need a set of predictions.\n",
    "\n",
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "# Generate cross-val'd predictions for each datapoint\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)\n",
    "\n",
    "# ROWS = actual classes\n",
    "# COLS = predicted classes\n",
    "\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "print(confusion_matrix(y_train_5, y_train_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Classifier metrics: precision = TP/(TP+FP); recall (sensitivity) = TP/(TP+FN)\n",
    "![alt text](pics/precision-recall-50pct.png \"Logo Title Text 1\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7171396564600448 0.7085408596199964\n"
     ]
    }
   ],
   "source": [
    "print(3841 / (3841+1515), 3841/(3841+1580))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "precision:\n",
      " 0.884098786828\n",
      "recall:\n",
      " 0.752813134108\n",
      "f1:\n",
      " 0.813191192587\n"
     ]
    }
   ],
   "source": [
    "# precision, recall, f1 metrics\n",
    "# precision/recall tradeoff: increasing one reduces the other.\n",
    "\n",
    "from sklearn.metrics import precision_score, recall_score, f1_score\n",
    "print(\"precision:\\n\",precision_score(y_train_5, y_train_pred))\n",
    "print(\"recall:\\n\",recall_score(y_train_5, y_train_pred))\n",
    "\n",
    "# F1 score favors classifiers with similar precision & recall.\n",
    "print(\"f1:\\n\",f1_score(y_train_5, y_train_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Precision/Recall Tradeoffs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 57844.42736708]\n",
      "[ True]\n"
     ]
    }
   ],
   "source": [
    "# Scikit doesn't let you directly set threshold values (which drive the decision\n",
    "# function for precision/recall.) But you can use the decision function itself.\n",
    "\n",
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "print(y_scores)\n",
    "\n",
    "threshold = 0\n",
    "y_some_digit_pred = (y_scores > threshold) \n",
    "print(y_some_digit_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[False]\n"
     ]
    }
   ],
   "source": [
    "# raising the threshold reduces recall...\n",
    "\n",
    "threshold = 200000\n",
    "y_some_digit_pred = (y_scores > threshold)\n",
    "print(y_some_digit_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![tradeoff](pics/decision-threshold-and-precision-vs-recall.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb69e0208>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# how to find the right threshold?\n",
    "# start with getting decision scores instead of predictions.\n",
    "\n",
    "y_scores = cross_val_predict(\n",
    "    sgd_clf, \n",
    "    X_train, \n",
    "    y_train_5, \n",
    "    cv=3,\n",
    "    method=\"decision_function\")\n",
    "\n",
    "# use results to build a precision/recall curve\n",
    "\n",
    "from sklearn.metrics import precision_recall_curve\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)\n",
    "\n",
    "# plot the result\n",
    "\n",
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, \n",
    "             precisions[:-1], \n",
    "             \"b--\", \n",
    "             label=\"Precision\")\n",
    "    plt.plot(thresholds, \n",
    "             recalls[:-1], \n",
    "             \"g-\", \n",
    "             label=\"Recall\")\n",
    "    plt.xlabel(\"Threshold\")\n",
    "    plt.legend(loc=\"upper left\")\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb69e0ac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot precision vs recall to look for knee of the curve\n",
    "\n",
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"Recall\", fontsize=16)\n",
    "    plt.ylabel(\"Precision\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(10, 4))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000,) [False False False ..., False False False]\n",
      "precision:\n",
      " 0.924948770492\n",
      "recall:\n",
      " 0.666113263236\n"
     ]
    }
   ],
   "source": [
    "# assume you're targeting 90% precision:\n",
    "# guesswork from precision-recall curve suggests setting threshold ~50000\n",
    "\n",
    "y_train_pred_90 = (y_scores > 50000)\n",
    "print(y_train_pred_90.shape, y_train_pred_90)\n",
    "\n",
    "print(\"precision:\\n\",precision_score(y_train_5, y_train_pred_90))\n",
    "print(\"recall:\\n\",recall_score(y_train_5, y_train_pred_90))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ROC (Receiver Operating Characteristic) curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nwQJLEsaYMicyE0WENyjWr19Pr169OPPMM9m/fz8ul4tBgwZZET9jTJkUkYkiUvOEx+PhySef5NRT\nT2XlypU899xzVK9e3emwjDEmqMgco4jA0exDhw5x3nnnsWzZMq644grGjh1LnTp1nA7LGGMKFZEt\nikiS95xKlSpV6NixI++88w4zZ860JGGMiRgRmSgipT2xaNEizjjjDLZs2YKIMGXKFAYMGOB0WMYY\nUySRmSjKeKZIS0vjzjvvpGfPnuzfv5+9e/c6HZIxxhRbZCaKMtym+OSTT2jXrh1jxozh9ttvZ9Wq\nVXTt2tXpsIwxptgicjC7LHv11VdJSEjg66+/5qyzznI6HGOM+cMiMlGUta6nWbNm0apVK9q2bcu4\nceNISEggISHB6bCMMaZERGjXU9mwe/duBg4cyIABA3j++ecB/91NliSMMdEkIhOF05lCVXn11Vdp\n06YNH3zwAU888QTjx493NihjjAmTiOx6ctro0aO566676NGjB5MnT6ZVq1ZOh2SMMWETkYnCibue\nfD4fe/bsoW7dutx4440kJSVx880343JFZqPMGGNCFZFnudIezF67di09e/bk/PPPJycnh+TkZIYN\nG2ZJwhhTLtiZLojc3Fwef/xxOnbsyM8//8z9999PbGys02EZY0ypitCup/Dbtm0bl19+OT/99BNX\nXXUVL730ErVrR+883cYYczKRmShKoe+pVq1aVK5cmXfffZfLL7887PszxpiyKiK7nsKVJ77++msu\nuugi0tPTSUxM5Msvv7QkYYwp9yIyUZS0o0ePctttt3H22Wezbt06tm3b5nRIxhhTZkRkoijJBsVH\nH31Eu3btGD9+PH/+859ZuXIlKSkpJbgHY4yJbBE6RlEy2/H5fDz00ENUqlSJRYsWceaZZ5bMho0x\nJopEZKL4I20KVWXWrFn07t2bqlWrMnv2bGrVqkV8fHwJxmeMMdEjIrueimvXrl1cccUVDBw4kNGj\nRwPQsGFDSxLGGBNERLYoitr1pKq88sor3HPPPWRnZ/PUU09x9913hyc4Y4yJMhHZoihqx9MDDzzA\n0KFD6dChAytWrODee+8lJiYic6QxxpS6iDxbhvLAndfrJT09neTkZIYOHUrTpk0ZPny41Wcyxpgi\nishEUZjVq1czdOhQ6tevz8yZMznllFM45ZRTnA7LGGMiUkReXud6fSdcnpOTw7/+9S9OO+00Nm7c\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb68d8128>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# ROC plots TRUE POSITIVE rate (TP = recall) vs FALSE POSITIVE rate. (FP = 1-specificity)\n",
    "\n",
    "from sklearn.metrics import roc_curve\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)\n",
    "\n",
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('False Positive Rate')\n",
    "    plt.ylabel('True Positive Rate')\n",
    "\n",
    "plot_roc_curve(fpr, tpr)\n",
    "plt.show()\n",
    "\n",
    "# tradeoff: higher recall (TP) => more false positives produced.\n",
    "# dotted line = purely random classifier results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.964880839199\n"
     ]
    }
   ],
   "source": [
    "# area under curve (AUC) metric:\n",
    "# perfect score = ROC AUC = 1.0\n",
    "# random score = ROC AUC = 0.5\n",
    "\n",
    "from sklearn.metrics import roc_auc_score\n",
    "print(roc_auc_score(y_train_5, y_scores))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nBg4cqM+F3AavTBQ+Gezfe86cOVSoUIEqVaowduxY/P39r3e0KaVS58qVKwwaNIgLFy6QLVs27rnn\nHiZOnEhgYCD//ve/qVq1Knny5CFnzpx069bt+iyPYWFhBAUFERUVRbZs2ejatSsvvviiw9/Gu3np\n6LEhVC8R6HQonDx5koEDBzJ79mx69uzJ5MmTnQ5JqTSxe/duKlWq5HQYKpUS+/e7ndFjM3AjTsZl\njGH69OlUqlSJRYsW8dFHHzFu3Dinw1JKKY/wyqYnp40aNYrnn3+eRo0aMXnyZCpUqOB0SEop5TFe\nmSic6KKIjY3l1KlTFCtWjO7duxMQEMAzzzyDj49WypRSmZue5dywe/du7r//fh588EEiIyPJmzcv\nvXr10iShlMoS9EyXhKioKD788EOCgoL466+/GDJkiM4ToZTKcryy6Sk9HDlyhEcffZQtW7bw5JNP\nMnLkSIoWLep0WEople60RnELRYoUITAwkLlz5/L9999rklAqncUNF161alXatGnDhQsX0qTcw4cP\nU7Vq1TQpK7533nmH4sWLXx/6/LXXXkvzfcTZsmULixcv9lj5CWmiiGf16tU8/PDDXL16lZw5c7Jy\n5UoeffRRp8NSKkuKGy58x44dFChQgDFjxjgdUrIGDx7Mli1b2LJlCx9//LHbn7vV8CO3kt6JQpue\ngEuXLvH6668zduxYSpcuzZEjR6hcubLTYSmVIZR+7WePlHv449Zub9ugQQO2bdsG2Ce227Vrx/nz\n54mKiuL999+nXbt2HD58mFatWtGoUSPWrl1L8eLFmT9/Pjlz5mTTpk0888wzgB2VNk54eDj9+vUj\nJCSEbNmyMWLECJo2bcr06dOZN28eV69eZd++fbz88stERkby9ddfkyNHDhYvXkyBAgXcin358uW8\n/PLLREdHc++99zJu3Dhy5MhB6dKl6dixI0uXLuXVV1/l3nvvZcCAAYSGhhIQEMCkSZOoWLEiP/74\nI++++y6+vr4EBgaybNky3nrrLcLCwggODub111+nY8eOKTjyKZflaxS//PILVatWZdy4cbzwwgts\n375dk4RSGUhMTAzLly+nbdu2APj7+zN37lw2b97MihUreOmll67PNbFv3z4GDBjAzp07yZcvH7Nn\nzwbs4IGjRo1i69atN5U9ZswYRITt27fz3Xff0a1bN8LDwwHYsWMHc+bMYePGjbzxxhsEBATw559/\n0qBBA7766qtEY/3888+vNz0tWbKE8PBwunfvzvfff8/27duJjo6+6eHcggULsnnzZjp16kTv3r0Z\nNWoUmzZtYvjw4fTv3x+AYcOGsWTJErZu3cqCBQvInj07w4YNo2PHjmzZssXjSQKyeI0iNjaWN954\ngzx58rBmzRoaNGjgdEhKZTgpufJPS3FjNh0/fpxKlSrx4IMPAnZkhKFDh7Jq1Sp8fHw4fvw4p06d\nAqBMmTIEBQUBULt2bQ4fPsyFCxe4cOECjRs3BqBr16788ssvAAQHBzNo0CAAKlasyF133cXevXsB\naNq0KXny5CFPnjwEBgbSxjVGerVq1a7XbhIaPHgwL8cbf33r1q2UKVOG8uXLA9CtWzfGjBnDCy+8\nAHD9JH/lyhXWrl3LE088cf2zERERANx33310796dJ598kvbt29/WMU2tLJcojDHMmTOHZs2akT9/\nfubPn0+RIkWuz6KllMoY4voorl27RsuWLRkzZgzPPfccM2fOJDQ0lE2bNuHn50fp0qWv1wLi/x77\n+voSFhaW6v3HL8vHx+f6so+PD9HR0akuN75cuXIB9qI1X75816dwjW/8+PH88ccf/Pzzz9SuXZtN\nmzalyb5TIks1PZ04cYL27dvz+OOPM2rUKABKliypSUKpDCwgIICRI0fy2WefER0dzcWLFylSpAh+\nfn6sWLGCI0eOJPn5fPnykS9fPoKDgwGYOXPm9ffuv//+68t79+7l77//TtMheSpUqMDhw4fZv38/\nAF9//TUPPPDAP7bLmzcvZcqU4ccffwTsBW1cM9mBAweoV68ew4YNo3Dhwhw9epQ8efJcn5MjPWSJ\nRGGMYerUqVSqVIn//ve/fPrpp/+YKUsplXHVrFmT6tWr89133/H0008TEhJCtWrV+Oqrr6hYsWKy\nn582bRoDBgwgKCjoprmz+/fvT2xsLNWqVaNjx45Mnz49TS8c/f39mTZtGk888QTVqlXDx8eHvn37\nJrrtzJkzmTJlCjVq1KBKlSrMnz8fgFdeeYVq1apRtWpVGjZsSI0aNWjatCm7du0iKCiI77//Ps3i\nvRWvHGY8ZGMI1VIwzPiQIUP49NNPady4MZMnT74+EYpSKnE6zLh3S+thxjNtH0VMTAxXr14lb968\n9OzZkzJlytC7d28dn0kppVIoUyaKnTt30rNnT4oXL87s2bMpX7789bsOlFJKpUymuryOjIzkvffe\n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\nYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb6958dd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# train Random Forest classifier\n",
    "# compare its ROC curve & AUC to SGD classifier\n",
    "\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "forest_clf = RandomForestClassifier(random_state=42)\n",
    "\n",
    "# Random Forest doesn't have decision_function(); use predict_proba() instead.\n",
    "# returns array (row per instance, column per class)\n",
    "\n",
    "y_probas_forest = cross_val_predict(\n",
    "    forest_clf, \n",
    "    X_train, \n",
    "    y_train_5, \n",
    "    cv=3,\n",
    "    method=\"predict_proba\")\n",
    "\n",
    "# To plot ROC curve, you need scores - not probabilities.\n",
    "# use positive class probability as the score.\n",
    "\n",
    "y_scores_forest = y_probas_forest[:, 1]\n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)\n",
    "\n",
    "# plot ROC curve\n",
    "plt.plot(fpr, tpr, \"b:\", label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.992589481683\n",
      "0.985567461185\n",
      "0.831396421324\n"
     ]
    }
   ],
   "source": [
    "# Random Forest curve looks much steeper (better). How's the ROC AUC score?\n",
    "print(roc_auc_score(y_train_5, y_scores_forest))\n",
    "\n",
    "# How's the precision & recall?\n",
    "y_train_pred_forest = cross_val_predict(\n",
    "    forest_clf, \n",
    "    X_train, \n",
    "    y_train_5, \n",
    "    cv=3)\n",
    "\n",
    "print(precision_score(y_train_5, y_train_pred_forest))\n",
    "print(recall_score(y_train_5, y_train_pred_forest))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Multiclass Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 5.]\n"
     ]
    }
   ],
   "source": [
    "# some algorithms (RF, Bayes, ..) can handle multiple classes\n",
    "# others (SVMs, linear, ...) cannot\n",
    "\n",
    "# one-vs-all (OVA) strategy for 0-9 digit classication:\n",
    "# 10 binary classifiers, one for each digit -- select class with highest score\n",
    "\n",
    "# one-vs-one (OVO) strategy:\n",
    "# train classifiers for every PAIR of digits -- N*(N-1)/2 classifiers needed!\n",
    "\n",
    "# Scikit detects using binary classifier when multi-class problem is present,\n",
    "# auto-selects OVA.\n",
    "\n",
    "sgd_clf.fit(X_train, y_train)\n",
    "print(sgd_clf.predict([some_digit])) # can SGD correctly predict the \"five\"?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-177277.32782496 -561668.18573184 -385895.43788059 -114677.95360751\n",
      "  -410210.58824666   57844.42736708 -654717.63929413 -200777.6510135\n",
      "  -772154.70175904 -614737.18986655]]\n",
      "[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]\n"
     ]
    }
   ],
   "source": [
    "# let's see 10 scores, one per class. \n",
    "# highest score corresponds to \"five\".\n",
    "\n",
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "print(some_digit_scores)\n",
    "print(sgd_clf.classes_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "prediction:\n",
      " [ 5.]\n",
      "prediction via Random Forest:\n",
      " [ 5.]\n",
      "probability via Random Forest:\n",
      " [[ 0.1  0.   0.   0.1  0.   0.8  0.   0.   0.   0. ]]\n"
     ]
    }
   ],
   "source": [
    "# to force Scikit to use OVO (in this case) or OVA: use corresponding classifier.\n",
    "\n",
    "from sklearn.multiclass import OneVsOneClassifier\n",
    "\n",
    "ovo_clf = OneVsOneClassifier(SGDClassifier(random_state=42))\n",
    "ovo_clf.fit(X_train, y_train)\n",
    "print(\"prediction:\\n\",ovo_clf.predict([some_digit]))\n",
    "\n",
    "# same thing for Random Forest (RF can directly handle multiple classifications)\n",
    "forest_clf.fit(X_train, y_train)\n",
    "print(\"prediction via Random Forest:\\n\",forest_clf.predict([some_digit]))\n",
    "print(\"probability via Random Forest:\\n\",forest_clf.predict_proba([some_digit]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CV score:\n",
      " [ 0.84843031  0.85419271  0.81062159]\n"
     ]
    }
   ],
   "source": [
    "# let's check these classifiers via CV. SGD first.\n",
    "\n",
    "print(\"CV score:\\n\",cross_val_score(\n",
    "    sgd_clf, \n",
    "    X_train, \n",
    "    y_train, \n",
    "    cv=3, \n",
    "    scoring=\"accuracy\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CV score, scaled inputs:\n",
      " [ 0.91011798  0.91089554  0.90908636]\n"
     ]
    }
   ],
   "source": [
    "# scaling the inputs should help improve the scores.\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "\n",
    "print(\"CV score, scaled inputs:\\n\",cross_val_score(\n",
    "    sgd_clf, \n",
    "    X_train_scaled, \n",
    "    y_train, \n",
    "    cv=3, \n",
    "    scoring=\"accuracy\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Error Analysis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "confusion matrix:\n",
      " [[5735    4   24   11   13   45   43    8   37    3]\n",
      " [   1 6489   43   24    6   35    8    8  116   12]\n",
      " [  57   38 5329   88   79   27   92   60  174   14]\n",
      " [  53   41  140 5333    2  234   35   60  142   91]\n",
      " [  17   26   36   10 5371    8   48   30   77  219]\n",
      " [  69   38   39  185   76 4600  114   28  175   97]\n",
      " [  34   24   42    2   41   95 5625    7   48    0]\n",
      " [  22   21   64   31   49    9    8 5792   14  255]\n",
      " [  54  157   70  148   14  158   58   28 5029  135]\n",
      " [  42   37   25   85  155   36    2  193   75 5299]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nRK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb68d8cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# as earlier: a confusion matrix from the SGD classificer\n",
    "\n",
    "y_train_pred = cross_val_predict(\n",
    "    sgd_clf, \n",
    "    X_train_scaled, \n",
    "    y_train, \n",
    "    cv=3)\n",
    "\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "print(\"confusion matrix:\\n\",conf_mx)\n",
    "\n",
    "# image equivalent\n",
    "plt.matshow(conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP4AAAECCAYAAADesWqHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADCFJREFUeJzt3V+InYWZx/HfLzOTmfyRtJhe2CRoxMWqgTV1WLRCBI2w\na0rjxV5YSaG9yc1uY0KhtN5UFO9KbQUpDMlWtKG5SAWXunS70PZib+JOYqA1SXVIs3HslMQ/TUL8\nk2Ty7MWcgOu6Oe+R85x3Tp/vB4RkfH14GOc77zln3nmPI0IAalnS9gIABo/wgYIIHyiI8IGCCB8o\niPCBgloL3/bf2/6D7Rnb32lrj6Zsr7P9G9tHbL9q+5G2d2rC9ojtV2z/ou1dmrD9Gdv7bR+zfdT2\nXW3v1I3tXZ2vid/b/pntibZ36qaV8G2PSHpG0j9IulXSV23f2sYuPbgk6VsRcaukOyX90xDsLEmP\nSDra9hI9+JGkX0bEFyT9rRb57rbXSNohaTIiNkgakfRQu1t119YZ/+8kzUTE8Yi4IGmfpK0t7dJI\nRMxFxKHOn89p4QtyTbtbXZ3ttZK2SNrd9i5N2F4laZOkPZIUERci4i/tbtXIqKRltkclLZf0p5b3\n6aqt8NdIeuMjf5/VIo/oo2zfIGmjpAPtbtLVDyV9W9LlthdpaL2k05J+0nl6stv2iraXupqIeFPS\n9yWdlDQn6UxE/Krdrbrjxb0e2V4p6eeSdkbE2bb3+f/Y/rKkUxFxsO1dejAq6YuSfhwRGyWdl7So\nX/+x/VktPFpdL+nzklbY3tbuVt21Ff6bktZ95O9rOx9b1GyPaSH6vRHxQtv7dHG3pK/YPqGFp1L3\n2v5puyt1NStpNiKuPJLar4VvBIvZZkl/jIjTEXFR0guSvtTyTl21Ff5/Sfob2+ttL9XCiyH/2tIu\njdi2Fp57Ho2IH7S9TzcR8d2IWBsRN2jh8/vriFjUZ6KI+LOkN2zf3PnQfZKOtLhSEycl3Wl7eedr\n5D4t8hckpYWHVgMXEZds/7Okf9fCq6D/EhGvtrFLD+6W9DVJv7N9uPOxRyPi31rc6a/RNyXt7ZwQ\njkv6Rsv7XFVEHLC9X9IhLfzk5xVJU+1u1Z35tVygHl7cAwoifKAgwgcKInygIMIHCmo9fNvb296h\nF8O2r8TOgzBs+7YevqSh+oRp+PaV2HkQhmrfxRA+gAFLuYDH9tBdFTQ2NtbouMuXL2vJkubfL+fn\n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\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb1f6f5f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# focus on errors.\n",
    "# 1st: divide each value in confusion matrix by #images in corresponding class\n",
    "# (compares error rates instead of #errors)\n",
    "\n",
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums\n",
    "\n",
    "# fill diagonals with zeroes to keep only the errors, and plot.\n",
    "# brighter colors = more misclassifications\n",
    "\n",
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()\n",
    "\n",
    "# rows = actual classes\n",
    "# cols = predicted classes\n",
    "# 8s & 9s are a problem."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeUAAAHVCAYAAADPSuPPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd8jdf/wN83VhCEErRUtNpSK7SoqtWiaEvtUalRtfcu\ntVdT1K5RNRpqi1A16qu2GjFii02omZCSBMn5/fH8znFvlpvkLpz363Vfrvs89zmfPM896zNNQgg0\nGo1Go9E4HzdnC6DRaDQajcZAT8oajUaj0bgIelLWaDQajcZF0JOyRqPRaDQugp6UNRqNRqNxEfSk\nrNFoNBqNi6AnZY1Go9FoXAQ9KWs0Go1G4yLoSVmj0Wg0GhchrbMF+H90WjGNJj4mZwuQQnR/1mji\nY1V/1jtljUaj0WhcBD0pazQajUbjIuhJWaPRaDQaF0FPyk5k+/btbN++HZPJxMGDB50tjkaj0Wic\njJ6UNRqNRqNxEUwuUk/ZJYRwJLdu3aJ27doAPHjwgAMHDpApUyYnS+X6DB06lFu3brFnzx4ADh8+\njLu7OwC///47tWvXJkOGDHaX49KlS8yaNYvTp08DsGrVKtq3bw9Aq1at+OCDD2zRzAvlfX337l1e\neeUV8uTJA0DLli1p1aoVAF5eXuq8HDly2F/CVBITE8OyZctYvnw5YPweEtN21axZkzFjxgBQqlQp\nh8n4008/sXnzZtavX68+k32lcePGjB8/nly5cjlMHo11/fm5m5Rlhw0PD49/kf//W0wmE2XLlgXg\n/ffftzjnzTffpGvXrgCkTevYiLBLly7xyy+/ADB69GhMJuMZDRw4kHr16vHee+85RI6IiAhWrFgB\nwIgRI7h06ZI6lilTJjp16gRA8+bN8fHxcYhM1rJw4UL69u3LjRs3Ejzu5+dH37597dZ+REQEYPyO\nbt++neA5OXPmZMKECfj6+qa2uRdqUg4PD6dgwYLcu3cvwS+lSZMGgB49ejBu3Dj7SZdCnjx5wvnz\n5wGYMWMGkyZNImfOnAB8+eWXfPTRR4Dxdx47dozg4GAA9u3bx8cffwzA//73P7vIduzYMQACAgJU\n3z569CgeHh6q7WrVqnH16lXA6CelSpVymtlMyjt16lSWL19OWFhYgue9//77TJw4EUDdX3vw33//\nsXLlSrXIPnfuHGfPngXg5MmTREZGqgVNunTpqFmzJgDTp09PzsLmxZyU9+7dCxid4ObNm5YXMZuU\n4zVgdmzWrFkAtG3bNmXSJoNbt24BMHbsWBYtWqQGciGEklO+b968OQD+/v52lalYsWKcPHkywWPm\ncr366qsEBgYCULp0abvKlByioqLUwD5mzBhmzJgBGINmlixZuHLlCgBZs2a1edt//vknAJ9//nmS\n56VPn57vvvsOMHb3KeSFmpQBDh48yKRJkwBYs2YNr7/+OgAhISFER0cDkCFDBqZPn079+vUB8PT0\ntLe8SbJ161bAeI7bt28HwMfHh3HjxlGtWrVEv7d7924AKlSoQLt27QDU2GNLpk6dSu/evQHInDkz\nn332GQATJ04ka9asFpqja9euAfDaa69Rq1Yt9Xt2BFKrsHLlSv744w/A2GRlyJCBr776Kt75Z8+e\nZdGiRWojdufOHZvLFBAQAECvXr24evWqaqtcuXJky5Ytwe/cvHmTTZs2AcakLDcxVqDjlDUajUaj\neZ547nbKkvDwcB4/fpzocakeCQ0NpU+fPmpXbTKZGDt2LAD9+vVLiazJokOHDgDMnj07wd2x+Xv5\nLIoUKcKJEyfsJpObm1uC2oS4coGxWwZYu3aty6mywVj5FytWDDB+E2nTpuWvv/4CoHLlyjZv78yZ\nMwBUr15d7cgl9erVA2Dnzp3cunWLMmXKAMZOK2PGjClp7oXbKZtz+PBhChUqBBiaB7kLlUgV4aJF\ni8iePbuNRbSO0NBQi9+X3Om2adMmSfPXnTt3qFixIgAXLlxg3bp1AEqVbCuOHj1Kv379aNmyJQB1\n6tRJ1DclMjKSZs2aAbBhwwZ27drlMJPZr7/+yqBBgwCoUaOGug8tWrRI9D5OmzaNrl27UrhwYYBE\ntXupQWow0qRJQ+fOndWzTopVq1bRoEEDADZt2kT16tWtbc66/iyEcIWXzQkPDxfh4eGicePGwtPT\nU3h4eAgPDw/Rrl07ERUVJaKiouzRbDy8vLyEl5eXcHNzEyaTSbi5uQk3NzfRoUMH9SpSpIg6Ls+x\nJz/++KOSo0aNGqJly5bq9fXXX4tChQqJQoUKqXPc3NxEv3797CpTcrl69aq4evWqKF68uLpvJpNJ\nVK1a1SHt379/X9y6dcviFRsbK2JjY0V4eLioVq2akmnMmDEpbcbZ/dJh/fnWrVsiY8aMImPGjBbP\n02QyiR07dqTkkjZj0qRJYtKkSeL1118XixcvFosXLxZPnjxJ9Pzo6GjRtm1bgbE4EY0bN3agtIkz\nY8YM4e7uLtzd3UWPHj0c2vaff/5p1bh74cIFUa9ePVGvXj3h5uYmqlevLq5fvy6uX7/uIEkTZ8uW\nLWLLli0ia9asYuLEiWLixIkiNjY2OZewqv9o9bVGo9FoNK6CtbO3nV82JSQkRPj6+gpfX1+10xs5\ncqQYOXKkrZt6Jvz/atnLy0v07NlT7arisnLlSnWuyWSyq0xPnjwRN27cEDdu3BDR0dHxju/evVvs\n3r3bZXfKoaGhomjRoqJo0aLxdlWbN292tngiNDRUNG7cWMk0ZMiQlF7K2f3SYf25e/fu6rfmajtl\nyZIlS5Tma9myZfGOBwcHi+DgYFGvXj0BiAoVKogKFSqIsLAwJ0hr8ODBAzFhwgQxYcIEkT59etG6\ndWvRunVrp8mTGEeOHBFHjhwRlSpVUs+9b9++4vHjx84WTcTGxopZs2Ypbeu8efNSeimr+o+zO6/N\nJuWQkBBRvHjxeOrMVA6KqSYoKEgEBQWJS5cuPfNcR6mvk+LcuXMJTnhr1651mkxCCKX6Wrt2rShR\nooSFbFIl9+uvv4pHjx45VK7Hjx+Lx48fi7CwMOHn5yf8/Pziybdq1aqUXt7Z/dLu/fnw4cPi8OHD\nwtPTM16/dbVJWQghbt++LW7fvi3u378vhBDi5s2b4ubNm2L06NFK/e7u7i5+/PFHER0dneCi11Ec\nPXpUVK1aVfWPLl26OF2mhPjpp59Enjx5RJ48eYSPj48YMWKEGDFihLPFEnPmzBFz5swRpUuXFt7e\n3mL9+vVi/fr1qbmkVf1Hq681Go1Go3ERXKWecoqIiooCYObMmQwZMoT//vsPMDysZdKQH3/8MV4C\nEUcSN75Xxi0PHjxYeRUKIVi9erWhugAqVarkMPkiIiIYNmwYALdv38bf3195X5tMJhWwn1Q8pr2I\njY0FYMeOHYwfPx5AebFKcubMydq1awEjttDR8s2dOxd46mVvjvzdSS9ijSWnTp2iRo0aAAkmFEmf\nPj2AQzK0Wcsrr7wCGJ7AM2fO5LfffgMMz2zpST5w4EBat27tNBllLHLt2rXJnDkzq1evBuDTTz91\nmkzmPH78WOU/8PPz4+DBg1SpUgWACRMmOC3KIzQ0lHnz5gFGdsAnT54A0KdPn2d629uS525Sljdq\n3rx5KvB748aNFufUrVuXH374AYC3337bsQI+AxmONXv27HghUTLV4E8//eQwefr06cOcOXMSPS6z\n2CQWQmVL5CS8YMECQkJC1POVWXbMee211wAjQUP+/PntLltCLFq0KMHJWCLl7tGjh0pw4uamlVOS\nixcvqkVqQsgwqPDwcIvEIo5GPseAgACVAOP48eNkz56dChUqqPNkYqO2bdsybNgwZs6cCUCtWrUc\nJuvOnTv59ttvAaOPLF68GG9vb4e1nxTyPi5dulQl1PHw8KB9+/ZqvLZHwp/EiImJUclTdu7cydSp\nU4mMjASgTJkyavzJkiULMTExKuOc3cdCa/Xcdn5ZjXRaMHdCiusg4ubmpuw7PXv2FGfOnElOE3bj\nwIEDSkb+36HL/L0jndFOnz4tTp8+LbJlyxbvHiZ0b4sVK2Z3mfr37y/69++fqG3R/JU1a1aRNWtW\nERwcbHe5EmPx4sUJyla4cGFRtmxZ4enpqWylXbt2FV27dk1uE87ul3btzzdu3FB2eHd39ySfd9Wq\nVUXVqlVFnTp1xPjx45N5G5PPoUOHxKFDh0Tp0qVFunTpRLp06QQgPv/8c/H555+L0aNHi8jISIvv\nSHttcHCwqFChguo7bdq0EZGRkfHOtyVTp04VU6dOFenTpxeFCxcWhQsXFrdv37Zbe8khMjJSjB8/\nXqRNm1akTZtWuLu7i/r164v69euL06dPO02uwMBA5VwrX1LGrFmzqs+yZ88uvL29RdmyZUXZsmVF\nv379xMWLF8XFixeT26S2KWs0Go1G8zzx3GX0Wrp0KQB9+/ZVKsy4NuNz585ZqLRz5MihKviMGjUq\n1cKmlIULF6rMO0LEz+gl7c/79++3uyzS7tSrVy+lkgNDnS1VigsWLLD4TkxMjF1lGjBgAGD4AcDT\nAgWtWrVSNqi4RSCqV6+u1EyOrrIVGxvLoUOH4n3+9ttvkyVLFpVZrF69esoedfTo0eSo21/ojF7m\nfPPNN0r9mz9//ngmKXPSpEmjsih16NBBFYX48MMPUyJrgsjMbVOmTFH+FF9++aXV379//76y4f7z\nzz/Kdr527VplK7cVQUFB6m9/5513VNELZ1eAevDgAQBfffUVgYGB6j4OHDiQqlWrOlM0wDCLyLzm\nYPjNyMIYuXLlUuY0MO6xLOYREBDAjh07AKO6mbyGFVnnXsyCFNYibQPNmjVj48aNyilsxIgRDB48\n2NbNWcX27ds5deoUABUrVqRIkSKAkQ5yx44dKuWdIyZlaxg1ahRDhgxR/zf/kdoDef2jR4/y7rvv\nqs/TpUunfAl27txJ//79Le5RaGgoAHnz5rWrfCll+PDhDB8+HDAGe+kQZAUvzaQMTwsOZMuWjZCQ\nEPX52bNn1cILjMWi+biVOXNmwFig9enTB7DtBJ1SpL1SFogACAsLs3mBjf379yvbdvr06VUKyLt3\n71K+fHlVPKVEiRI2bfdZyEW2n58fBQsWVH2gbt26DrUd2wNZWW/IkCGqTGvHjh2f9TVdkEKj0Wg0\nmueJF3anbM68efP45ptvAMidO7cqG+aoZOzPYuPGjdSuXduh6mtr2LRpk4XnqL3V19ayePFii1Jv\nP//8M5BwWJIr0LJlS1WOU++UU0/v3r1Vjd24yIIR0gM5tfz333/8888/gOF1+8knn1j93bt37wJG\ngRlZEMceO2V4GrExdepUi8+vXbumPP7LlSunNAnPKj1qC6ZNmwYY6mpZhxyMiA45rpQrV44OHTok\nWibR1Zk7d66q/W1FwYyXW30dF6li2L9/P7Vr1wZQ8a3OJigoiNq1a6vasvaelM+cOaNUheXLl0/0\nPHtNyrKw+saNG+nRowdAsqooxZ2UpbrO3DbuCkj15RdffKHUrXpSTh2PHj0iW7ZsKkQqLrK6mswB\nkFK2bdsGGKpX6Q+wbNkyFSJoDdLuWKlSJQoUKAAYA3cKK4aliCNHjqjqW2PGjFE206+//pqpU6c6\nJMQsPDycDRs2EBwcDMAff/yh1L/379/Hy8uLFStWAKjKWs8Lc+fOZeDAgYBRDewZz9aq/vzcxSmn\nFOkMtn//fg4cOGCz6966dYuAgAD1Y5J2YmtYtWoVYNgibt++reIa7U2vXr2UHTYhRyWJvcpHyrKa\ngwYNUrHZUpPxLCIiItSuU2Juf7Y1u3fvVhqV5AxgJ06cUPHfLrLwfa6RReVHjhyZ6IScKVMm5bOR\nmkn5/Pnzyqnryy+/VLkFkjMhR0dHqx0UGLt7SN7i0xaULFmSkiVLAob2QPqIjBs3jjx58jBixAi7\ny+Dp6UnTpk1p2rQpYCwOpM/AqFGjWLhwIXXq1AGMHb90hrV3TH///v3VZk2WXbUW88RGUiNy584d\n8uXLl2q5tE1Zo9FoNBpXwdqAZju/7E6OHDlEjhw5hJubm6hWrZqoVq2aTa7brl07lQCE/08CkitX\nLpErVy7Rvn17MWjQIDFo0CBx4MAB0a5dO1GpUiVRqVKleMlDKleubBN5nsX06dOFyWQS+fLlE/ny\n5RPLly9P9NxPP/3UIoGIrViwYIFYsGCBMJlMKslLQEBAkvVWHz58KB4+fGhRp1gWozh37pw4d+6c\nzeQTQojz58+L8+fPC3d3d7FhwwaxYcOGZ35HFqfYtWuXyJEjh5IxZ86cYtasWWLWrFnJrXrj7H7p\n1P4cEREhIiIixPLlyy0SsST2WrBgQarbfPjwoShRooRo3769aN++fYqv0759ezUmVK5cWf0tziY0\nNFSEhoYKQHTs2NHZ4gghhFi7dq0qSAGIgIAAERAQYLf2Zs6cKWbOnCly5colrly5Iq5cuZLsa8ye\nPVvMnj1blCtXTixZskQsWbLEmq9Z1X9cWn29fPlyZs6cqeLuUsKDBw/w8fFRKgZPT0+bhkStXr3a\nIu2ayWRSsbS//PKLUl2OHTvWIjbZZDKp97ly5XJoak0hhFJfN27cGD8/PwB8fX3JlSuXUlufPn3a\nLqrXypUrA/Dmm29y7tw5AOrXr6/UWyNGjKBQoUJKRbR06VJ1f4KCgoCnqsS+ffvyxhtv2FxGGYIV\nHR2tnGPmzJlD8+bNASP1XlwmTJgAxE/72qlTJ9q1a2dzGV8krl69qhxl5LOW9s99+/Yl+V2pnq1b\nt26q5YiKiiI4ODhFTqDXr18HYPr06cyfP58WLVoAhsOTh4dHqmV7Ufn888+VytrPz4/NmzcDyYsL\nTw4XLlwADNPj+fPnAZKldj5x4oT6jW7cuFH5AtkKrb7WaDQajcZFcOmdcr58+QgKClLJymvUqBGv\n6lJCXLlyhb///huAiRMncv78ebUr7dy5s02rMJmrHcw/s+a9dEZZuXJlshzEUkOnTp34888/Wb9+\nvfpMBvkPGDCABg0asHLlSnVM3jfzBAipRXqibtiwQV33zJkzLFmyRH2eM2dOdb/kblqSNm1a5s+f\nDxg7fXsgnUzSpEnD8ePHAaMIgfm9eRbvvPMOYBQo0CRN+vTp1U5XJvqxhmzZsilHLFuG1UhnwosX\nLzJo0CCAeOFQW7duVREJ27dvZ/LkyYBR8apLly4qbMse1YVkRr67d+/y1ltvWeWEGBsbq7SO7u7u\nNGrUyOZymSM1bkWKFEmyiIMQQmVQA/sXETJ3IGvSpAlgyPqsjFyyoEbNmjVp2LAhgM13yfAchEQ1\nbtxYDYQZM2ZU2Xu+/PJLXn31VcuL/P/fsmzZMovKQhkzZlQdt0OHDqRLl85mgl++fJnt27erjEPm\nJRhNJpPFe/MsXt9++62alB2dHnLatGl07949wWPmKnZA3eO1a9fataRajx49mDJlyjPPq127Nv37\n93dY6MSsWbMYPXo0gEqzZw3dunWjb9++wNOKVingpQqJkmUQW7VqleR5ZcqUUb/Fhg0bqpSbtiA6\nOppatWqpRT08nVTjqqDv3bun+nfZsmWVJ2/37t0pUKCAShNrD44ePQoYcb6ZM2dWGcxy5MhhsXjI\nmjWr6itjxoxRJpZy5cqxZ88eu8kHTxcxzZo1S3RhunXrVpYtW6aqqJUrV06VZ5VlMu1F+fLlVQz6\nG2+8wYwZM9SmT6ZuBSOka/bs2SruukSJEirXRTLRGb00Go1Go3mecPmdcnR0tIrfnTlzptoBJ6QO\nMd+VSooWLcqkSZP4+OOPbSrw88zjx49VvKIs/iAx3ym/+uqryinO3o5Kjx8/Vg5So0eP5sqVKyp2\nEZ4mCPn4448dUtvZnH///ReAmzdvqiLoUlVpjix68uWXX1KtWjVb7JReqp2y7L+hoaFMnz5dFago\nV66cOuf999+ndu3ado33ffLkiXI6mzRpEvfv3weMOFS5g37//ffp1q2bqlX84Ycf2nVnnBgyT4L5\nzv7IkSOAsdPcuXOn+tzDwwNfX1/gaRY8eyLH6iZNmnD37l3l+JYuXTpVrGXv3r3ExsZStmxZANat\nW2exS7Un9+7dU6Y7OcdIB07zmPRHjx6RNWtWtYMvXrx4Spt88TJ63b17Vw2QgYGBynNu48aNvPnm\nm+q8YsWKUaZMGcAYIJ/35Of24PHjx4Dh4Sp/mDLRv5z0Bg0a5JDkAppEeakmZc2LyenTp/Hz81NZ\nBDdt2kSzZs3U8Tp16vDRRx8BOGxClsgoizVr1hAQEKBMpZGRkarIR8OGDWnWrBm5c+dObXMv3qSs\n0bxk6ElZo3lx0DZljUaj0WieJ/SkrNFoNBqNi6AnZY1Go9FoXAQ9KWs0Go1G4yLoSVmj0Wg0GhdB\nT8oajUaj0bgIelLWaDQajcZF0JOyRqPRaDQugp6UNRqNRqNxEVy6dGNyGD58OMOGDQOM3NeyLFnN\nmjWpVasWefLkcYgcT548oU2bNsDT8m/mlC9fHoCePXvavXRaYuzfv59x48YBRpWrvHnzApA9e3Ya\nNmyoqrtYUw7uZebatWuqMtArr7zCpEmTAKhcubIzxdJoNClk69atAERERKhKXN27dyddunSkT5/e\nITLonbJGo9FoNC7CC7NTvnTpkiqkYDKZWLFiBYD6V1Y5GjNmzDOLWaeGOnXqsHnzZgAKFSpElSpV\n1LHQ0FBVZLxFixbs379fyWSPQuiJcfjwYVWR6dVXX+XevXuAUdB9/vz5qpjH1q1b7VqNJzkkVRlK\nFkUvUaIEbdu25dNPP3WITIcPH1Y1lq9evcry5csBePfdd8mVK5dDZHieefToERMnTgRg4cKFHDt2\nDDCqCDVs2JCOHTsCOKx29rN4+PAhixcvBoxxZcOGDXh6egJG5aAdO3YAkD9/fr766itGjRoF4JTq\nUYlx8eJFwKiQ9Oqrr+rfaRyCg4MBY3csNZmtWrUiNDSUevXqqWP23DW/MAUpVqxYoYrKX758OX4D\n//93Fi9eXKkcx48fr0p12YrWrVurSa1Tp07xjq9duxaAr7/+mvDwcMAo+SdLhzmCyMhI7t69C8Br\nr72mPg8KCqJ+/frq/vXs2ZOffvrJYXIlhSw5t2jRonjHzEt2ZsmShUuXLgGoAdMePHz4kHz58qln\naC5HxYoVCQwMtMXi74UuSNGtWzc2bNgAQMGCBdXkFR4ezp49e9R5Y8eOVZXMnEF0dDRgLP5k38if\nP79FadG4/PHHH3To0AHA6bKfOHECgCVLlhAQEABASEgI48aNo0+fPoAh78OHDwF4/fXX1Rj5sjJv\n3jx1D9KmTcs777yjjgUGBvLFF1+k5LLW9WchhCu8bMK1a9fEtWvXRHBwsBgyZIgYMmSIyJEjh3Bz\ncxMmk0mYTCbh5uamXn369LFV08nm7NmzAmPwEjly5BA3btxwmizmhISEKLny588vIiIiREREhLPF\nEnfu3BF37twRLVu2FPXq1RPu7u7C3d1dmEwmJa/JZBKvvfaauH//vrh//75d5fHz81O/KfnKmDGj\nyJgxo3p/+fJlcfny5dQ04+x+aZf+/OjRI/Ho0SPx559/iujoaBEdHW1xPDY2VixdulTkzJlTvcLC\nwkRYWFhy7p3NqFevnqhXr54oU6aM2LNnj9izZ48IDw9P9Pw7d+4IT09P0atXL9GrVy8HSmpw4cIF\nceHCBbF06VJRtmxZNd7JfgKILFmyiDfeeEO8/vrr4vXXXxcVK1ZUx7p37+5wmV2ZHTt2WPTzzz77\nLKWXsqr/aJuyRqPRaDQuwgtjUwaUF3HevHkpXrw4YKjI9uzZk6Cq6datWw6Vz5wCBQpQtmxZAPbt\n20doaCheXl5Ok0dSqFAh9f7KlSuEhoYCWKhvnEGOHDkAGDJkCLNmzVJmAHM8PDzYsGGDzU0SCSGL\no0tatWpFly5dAMMcERQUpGzd//vf//jwww/tLtPzQrp06QCoVatWgsdNJhONGzemWrVqgOHZvmzZ\nMuCpb4gjkTZtX19fcubMmeh50mwyYcIEXnvtNVq3bu0Q+QBiY2MBmDVrFn5+fhbySD744AOaNm0K\nGL/XJ0+esHv3bgBGjx7N2LFjAejVq5dNZQsPD+f06dOcO3dOyfr3338DhiktKQoXLqzU/47yfgaI\niYlh06ZNgNGfAbJlywZA27Zt7dr2CzUpJ0SmTJn4+eeflb3PnEqVKjlBIoOHDx8qW0/27NnVgsKV\nSMq5yhFIe+2qVauYO3cuYDhXSduXRIa7+fv7U6xYMYfI9tVXXzFv3jxlb/Tz81NOcXKAlMcuX76s\nJ+UUIBdiuXPndqgjZFx69uz5zHN++eUX+vfvDxiT3/79+x3qJCkninnz5qnPypcvT7NmzZTjY8GC\nBdWC6MiRI3Tr1o2oqCgAvvvuO7VISunkt3fvXjXZ7tmzh7CwMAB27NiBh4cHb7zxhjq3aNGiAHh7\ne8e7jpy8ly1bRtWqVenXr1+K5EkNR48e5bPPPrP47McffwTgyy+/tGvbWn2t0Wg0Go2L8ELtlB8/\nfgzAiRMnWLlyJWCE9ezatcsiXOrjjz8GUC7uzuDcuXNkypQJMFQ4csXqbGRYChgr64IFCzpchvnz\n57Njxw5+//13gATvTebMmQFo3LixUm9JdbEjKFCgAAcPHlS74nTp0imPzEOHDgGocJN3333XYXK9\nSIwfPx4wNA8NGzZ0sjTxOXfuHKNHjwZg3bp1dO7cGYBBgwbh7u7uUFm+/vprADW2ATRo0MBitx4T\nE6MS3Pzwww/4+vqqsDPzXWxykUmS2rZty6NHjwCoUKGCUvsvXLiQDBkykDt37kSvIcfu4cOHc+HC\nBcDQPnXo0MFh9zIkJIQWLVoAlqr/LFmyMGvWLGrXru0QOZztpWkz7+u///5bVKlSRVSpUsXCw1q+\nzL2vf/nlF/HLL7/Yotlkyzhv3jwxb9484e3trbwdhw8f7nBZEuL27duidOnSSi4/Pz+nyFG4cOF4\nns2YeVg3bNhQnDx5Upw8edIp8plz7949ce/ePZEvXz4LGXPkyCEePnwoHj58mJrLO7tfOqU/37hx\nQwwePFjkyZNH5MmTR2zbti21l7QJsbGx4sGDB+LBgwdi7NixwsvLS5QsWVKULFlSHDx40NniJciF\nCxfEpk2WQQ1qAAAgAElEQVSbxKZNm0TDhg2Fp6en8PT0FJMmTRL//fefTdooVqyYKFasmKhVq5a4\nevWquHr1qtXf/e2330T58uWVh/vatWtt0W+SzeDBg4WXl5fFeJM5c2aROXNmsWbNGls1o72vNRqN\nRqN5nnhu1ddhYWFMnz4dgJUrV3Ly5EmlOnmWg5IMmM+ZM6fdjfZSnXTo0CHu3btn4XBWunRpAAYO\nHGhXGZLi9u3b7Ny5EzBUR4cPH6Z79+4ATnGwAEM1fPr06USPX716lZMnTwKGd6azuH//Pl999RWA\n8lIHaNiwISNGjHCZbGiuSkxMjFL/njp1Sjn2bd26lfTp06vsSq+//rrTZHzy5AlLliwBjARFa9as\nAeC9996jV69eSmXt4eHhNBnNOXXqFGfOnAFg06ZNaoyUyGRBbdq0USag1CIjNmrVqmWRjCguN2/e\nBGDp0qX88ssvgBEp069fP2X6sXf2s1u3btGtWzfAcCBcunQpAHfu3IkXUSGd4qTDmqN47jJ6DR8+\nHIDp06dz584dy4uIp5mdZIq0AgUK0LFjR5o0aQLAgQMH1Pm+vr7Mnz8/VYI/C5nVa8aMGZQrV055\nWa9evVotHgYMGMCYMWPsJkNERAStWrUCnnYMyc6dO+MtYmQWr+bNmzslTGvfvn1s27aN+/fvA8ai\nS4ZOSFuPHFDGjh2rQpEcjb+/Py1btlT/l34Mn376qfIXSCUvdEavf//9Vy2KIyMjlVf92bNnAVTI\nYLNmzdTitmjRonYfuMPDw9VC+Z9//lE+AvA0YqNFixbUrFlThclkzZrVrjI9C9kv3nnnHeX1D4af\nhcx0eOzYMaZOnarOW7t2LW+++Waq25aboTRp0iT4bKKjo9myZYta7EdGRip/keLFi1uMSebjTebM\nmdXEaCuuXbvGd999ByRcMEgihFDjYs6cOdm2bRtFihRJbfNW9efnblKWP7AJEyaoz3LmzMkHH3zA\n4MGDAVSaS3P++OMPAIt4ZV9fXxYsWJAyiVPJwoUL1d/y77//MmDAALVrcHOzrVVh7NixapCJOwHn\nzp2bt956CzB2fsHBwWpxkzNnTuUMN336dJt3kOQgJ+jFixfzww8/qEEod+7cbNu2DXCsoxfAt99+\ny5w5cwAjflouGG3ICz0px0VOJqGhocyYMUPlrZf5mgHKlStHo0aN1GLXHtqIS5cuJRpD/d9//wGG\nY9K///5L/vz5AShWrJjaCDRo0MDhk7R09PL391cy9evXL96CVeZnb9GiBbVr11YLSVuPOYCq2ufv\n78/58+ctjsnFTIECBQBjsgQjDE7u9IsUKWLhMNagQQOb7O5lqtRPP/1Uabg6dOhgkZb3ww8/VDHc\na9eu5Z9//iEwMBAgyfSqz8Cq/qxtyhqNRqPRuAjP3U754MGDgLH6eu+99wD47LPPnpn8XwbVm2dj\neeONN5Q6W67cHInc4TVp0oQbN26oZCI2UJNYsHz5ckJCQoCnWc98fHwAeOutt5Q97PHjx5w+fVqp\nln744Qd1jd69e6sazK6A3MGvXr2aChUqACjbuKNYs2aNUr/26dNH7UpsaAN9qXbKiXHp0iVlg5w1\naxa3b99W4TV79+5Vuy1HEBERARh9xVztumHDBpVcIk2aNLRr144ePXoAOCTDnNQq+Pv7q4xeSflb\nVK5cme3btys7vq3Hv+3bt6uMbO3ataNixYqqljw81XDIsEFZIMfDw4N///0XMNTcW7ZsUSbGsLAw\nZdN3pC9JSEgI77zzjrKXr1u3jhIlSqTkUi9fQYqk8Pb2Ft7e3hZhUjVq1EgwIX5KePz4sXj8+LH4\n/vvvhb+/v/D397f6u3PmzBHp06cX/fv3F/3790+1LLZi4sSJKswnT548zhbHgpCQEBESEiLy58+v\nCkE4OkQqMjJStGnTRrRp00aYTCbRtGlT0bRpU3Hx4kVbNeHsfuly/TksLEx06dJF/S7r1q1rz+aS\nhSyaMmDAAJEzZ0415ly5csXZoilkMZCPP/5Y5MyZU5w7d06cO3fOLm0FBweL4OBgm11v4sSJonjx\n4qJ48eI2u6Y17N27Vxek0Gg0Go3mpcTa2dvOL7ty9OhRi+Qh+fLlE/ny5RNBQUE2a2Pu3Lli7ty5\nAlAJQpJDqVKlhIeHh/Dw8BDXrl2zmVyp4eTJkxYrxO3bt9vkulFRUSIqKkp07do11WUWP/roI7Vr\nGjBggE3kSw5SQzJ16lS1Y3/77bfF+fPnbXF5Z/dLl+zPT548ESNGjBAjRowQJpMp2ZopRxAUFCRy\n5MghcuTIIebMmeNsceLRs2dPAYjNmzeLzZs3O1scq+jatau6p45AahXq1q3r0J3ycxunbC3Hjh2j\nevXqFp/J6i0yTtgWVKlSBTCKI0jb0ieffKI8Ia1Bena6SsrNjBkzqtCehw8f2sx2J0NfFixYoJ5F\nqVKlUn3dRYsWqUo3jkIWSujSpYsqOjF06FBq1KjBwoULAcNjWGM70qRJoyItdu3apeypMkWiK1C6\ndGlVdGHlypV88803qbreuXPnVGhWqVKlVOhQcu3VMTExgGHDzZw5Mw8ePEiVXI5ApludPXs2mzdv\ndkibMTExfP/99wDKji1p3LixXdt2yUlZOlN069aNrVu3qlCDDh06KAePhFzj5Q/uxIkTjBw5Enjq\nACFDgVq2bEmbNm1sLrPMEd2vXz8VfvTpp5+yceNGgGRNzq7CmjVrVAwiPK3GlFqkU1779u1V8g3p\n5GYtMiTKPFe3eXymM5AhWT4+Pqxbt07FtP7xxx/xFoYa21C3bl1u3LjhbDGSxDyxTEpp3ry5Ciu6\nf/++cpDKnTs3RYsWVb+v2bNnW5Sk7dy5sxozT5w4oZw4Q0JCGDZsWGrCe+zOnTt3GDduHMePHwcM\nB6uPPvrIIW0PGDDAIuwWnjqX6ipRGo1Go9G8JLhkSFRC4UsSqXKuVKmSCpgHI1OX3JXKgHhzZMpI\nR6g3zbN4ybCAefPmkS9fvgTPj4qKwsfHR6mSjh075pQQLck///wDGKFmMlShRYsWSWbASQmXLl2i\nePHigJGII+7KNDE2btyonqdMxQiGJmXGjBk2ldGc0NBQZVqIW/Fm/vz5BAQEAKiaspIaNWqwYcOG\nlDSpQ6KewYABA1TSB1ktzBZIrYubm1uKkubcvn1bmS0+/PDDVPedESNGMGrUKOBpRaXk4ubmppKE\nfPTRR2zYsIEMGTKkSi5riIyMJDQ0VKXjTIr79+/z888/A0a427hx46z6ni0ICQlRbU+aNElpV7Nk\nyUKrVq2U9jUViWGs6s8uqb6WeY0TIigoCDDilWUZMolcYJhMJhXD/Morr9ChQwfq1q1rJ2njM3ny\nZMDoPDLjU/HixalUqZLK2lWsWDFlIxo7diynT59mypQpgH1jpvfu3ct///3HJ598oj6TA9C6detY\nsWIFixcvBoz7KLOjzZw50+ayFChQQNnaJk6cqLJ2FS9enObNm6si948ePVL29uHDh/Pbb78pE4fJ\nZFKpAkeMGGFzGc1Jly6dUknL8nLmmP/+4OnELdMLamzHqVOnAPj999/ZunWrza8vzSnbtm1T8cbW\nEhsbS+vWrZXaetCgQamWZ8iQIUrVPHfuXJVf4fr161y7dk0tHMxtxPnz56dUqVJq4Vq1alVVArNQ\noUIOmZDBmJTbtm2rcoibm8EuXbpkMfbt3LmT+vXrA4afhqMm5CFDhjBr1iyl+n///fdVat93331X\njemOQKuvNRqNRqNxEZ479XXc3Yg57du3B6Bjx454e3sDjsmmkxhPnjxh2rRpgLETvHz5MunTpwcg\nU6ZMalX7+PFjSpcuzf/+9z8AixystuaPP/6gadOmFo5ncqcscwzLe1yhQgXleSh3rbZG7oAbN27M\n+vXrgafPtmbNmoCRG1xqFeI+9wIFCqjMaI6oJiTV5lOnTo3nWCbvm5eXF+XLl1deo6lY7Wv1dRzu\n3LnD9OnTlZmic+fOykvWlsjfW926dVm7di0AJUuWTPI7spDGt99+y+7du5k1axaAKgZjL06fPq12\nvVLbBEZmQGfmqzdn586dylHKx8dHOeeFhIRQpkwZateuDRj3ylYOpc9ixYoVKud2QEAABw4cwNfX\nFzCcuT744APA0JDZKMf681uQQnpR+/v7s2HDBpVEHZ4OfLlz51Y2ZV9fX7y8vJxS0charly5wsSJ\nE1m2bBlg6ZHZrl07Ro8eTc6cOe0uR0xMDLt27VIl3SIiIti1axdgqGlq1qxJgwYNAKOSjKM6dVRU\nlKrkdfr0aZWUXhJ3MSY9nf/880/eeOMNh8hozsqVKwkMDFRhTz4+PlSuXBkwUpdKv4JU8lJNyvKZ\nR0dHc+/ePfX/GzdusGPHDgC2bNnCO++8w9ChQwGUqtPW3L59GzAiQKSvQOvWrdXEIpGewStWrFAp\ngN9++23Gjx+v/Ek0BtLkcPDgQTVWlytXzmkbp8DAQFWoaOTIkRw9elQ9s2eV/00huiCFRqPRaDTP\nEy65U9a83Dx+/JixY8dy5coVwFC5yyT1Pj4+9O/fX5VzS6qo+gvAS7NTjoyMVKaeKVOmcPXqVXWs\nbNmyqgBB586dVZ1lRxATE6NyHUyePJk9e/YkeJ6Pj4/SMPXv399l1MYal+L5VV9rNBrgJZqUNZqX\nAK2+1mg0Go3meUJPyhqNRqPRuAh6UtZoNBqNxkXQk7JGo9FoNC6CnpQ1Go1Go3ER9KSs0Wg0Go2L\noCdljUaj0WhcBD0pazQajQ2pXbu2Snyj0SQXPSlrNBqNRuMi6ElZo9G4BL1796Z3796YTCbKlSvH\n2bNnVeWl54kLFy6wZMkSIiIiVN1vDUybNo1p06aRL18+KlasSMWKFfH19bVLPeznmec6zebjx48B\n2L59O4sWLWLlypWAUTpP5qHt0KGDKuPoTGJjY3n8+DEhISEALFu2jJkzZwKowto9e/YEYOjQoWTN\nmhWwW7USgoKCAOPeSX777TeOHDliUZGpQIECAAwcOJBvv/3WLrIAPHr0iDlz5gBGxZ2///5bHStc\nuDD37t0DwNvbm7Jly9K5c2fAqMhkb+7evQsY1Yvu3LkDwIEDB1SheTDu47FjxxL8fqdOnahbty5g\nFJpPmzattU2/VGk2ZZnQJUuWsHz5clWS88MPP7SdZA7gxIkTfPzxxwwfPhx4WlLWVpQsWZKjR4+q\n/48aNYrs2bPHO+/69euMGjUqwXK3AwYMYMyYMTaVKymCgoIoX748YJS0lQghSJ8+PatXrwagVq1a\nDpPJCeg0mxqNRqPRPE881ztluTNu2LAhefLkIVu2bADcu3dPVRXy9PSkXLly/Prrr4DjqwpdunQJ\ngO+++44lS5ZY/b2lS5cCxt+W2t3ylStXVNuyEo8shm5eFF2S0Mo6bdq05MmTR/09tmbjxo3UrFnT\n6vNz584NwLp163jvvfdsLo/c9U6ePFnV8n3w4IEqih4XIUSiz8n82KxZs2jbtq21YrxUO2Vz3nvv\nPaVdGDJkSKoFciRhYWGMGjWKcuXKAdC4cWObXFeOCd988w2RkZFWfy+h/uzl5UWjRo2YMmWKTWR7\nFnv37lU75biymUwmXnnlFQAOHz5s9zH65s2bAIwbN07VzX748CEFChSgQ4cOAPaq0f7iV4lq0qQJ\nAK+88gpDhw5VA/WtW7dYsGABAH5+fty+fVupd86ePUuOHDlsIbNVXL9+HTB+AP7+/rRp0waAV199\n1eK8vXv3Wkza7u7ugLHASG0ZuOXLl9O0aVOLzxLqqNYc++mnnwDo3r17qmSKy6VLlyzMDE2bNlWq\nrAsXLljItnHjRv755x/AUAdv2bLFprLMnz+ffv36ASh1tWzbmok3qWNDhw5NziTz0k7KEyZMYPDg\nwYAxYD5PREREULJkSfr37w/YTn0tJ3lzs4k1JNaf8+XLR2BgIGCUnrQnFy9eVJPyjRs3LGQzl+uf\nf/6xa2nOsLAw3nnnHQDSp09PlixZADhz5ozFeZ06dWLq1Km2bl6rrzUajUajeZ6w2uPEFRk5ciQA\nWbJkUbtkgFy5ctGnTx/AWKX26dOH2bNnA4Y6WDoVSGcqe5I3b17A2GHKXaZEOngdPHiQwMBAMmfO\nDEC2bNn4/fffAWxSLD1jxoykT58eMByq4Onfnj17drp27QrA66+/bvG9vXv3xpNZOlzZmtdee429\ne/eq/5cuXTpRh6gvvviCatWqAYa6S/5N8m9MLf/73/8sdshJIVf1r776KpkyZQIgNDSUkydPKjWZ\nOYmpvzWW+Pn5KSdDV0Y+4+vXr7Nr1y4AfvjhB9KkSZMsc4w1SBXvsyhWrBhg9JONGzcqp864XL16\nVf0e7b1T9vb2Vur3KlWqxDsuVdZvv/22XeWIiopSDrXNmjVT93Tp0qWsXLlSeYLPmTOHL7/8EoBP\nPvnErjLF5blWX1tLWFiYhcr68OHDgOHF6GikKm7Hjh00a9YMgPDwcMDwcAbDm9LW+Pn5qTbq1q2r\n1M+VK1dO9DsJqb1jYmJsLltKkJ03JCSE9evXA9hsELx//776u9988031ecWKFdWAJ5HHM2TIYPF5\nQEAADRs2BCxVdN26dWPixInWivJSqa9lNEWHDh2YO3cu3333HYBDvYSfhbTl3rt3jxUrVqgIihMn\nTig1sbe3N+vWrePdd9+1adszZswAoEuXLmoBWqNGDYtz6tSpoyaTv//+m7Zt2yq/kbjq6+7duzN6\n9GjAWLjbk/DwcD7//HMAtXgxR26a7BnhYQ3yN+fn50f16tUBw9/FRljVn5/rnbI1xMTEEBwcrP5f\nuHBhu6/GzJGd+MqVK/j7+7N7924Ai5CfrFmzUqtWLQYNGmQ3OaR9S/6bFLJTyxAVMGT85ptv7CNc\nMjlx4gT//fcfAB4eHpQoUcKm18+aNSt//vlnqq4hhFCDtPnC104OJC8EmzdvBmDevHnkypVL/Q5d\nBT8/P6XBCg4OTtSHICAgwOYTMhiZwgBatGhB8+bNAShSpAjHjh1Ti4PAwEBlJ96zZ0+8OOlcuXIB\nUK9ePUaPHm33yRiMCblOnTpq7DO/b0IIOnbsqHxtnI25NsJZobTapqzRaDQajYvwwu+UBw0apFS3\nYHjV2XN1GB0drdo7efKksk3KXYAkW7ZsSt3ao0cP5VnpDKSMW7ZsYc2aNWqHbL6inTBhgkvslLdv\n30737t2VV3vNmjXjebI7mwMHDtCpUyeL+yft9S1btnSWWC5Pr1691PuTJ09abUO1N3K3OWvWrHiR\nAAlx/vx5u9hopY19wYIFKrpE7p6twdvbm7Vr1wLYZSefGBMmTGDnzp2JHl+1apXyp2ncuDFlypRx\nlGjxePDgAWA824oVKzpFhhdmUt67dy+xsbEAbNq0iRUrVgBw/PhxMmTIoP7/2Wef2VWOS5cuMWzY\nsGeelzlzZgoVKgQYzlyPHj2ymaOSNezZswcwnOVCQ0MBEs1IBYZDy/Xr15XjmqORMnbt2tXCHCHD\nG1wBGapSu3bteI5i0rFO2k018ZHOe6dPn2bEiBFKpekM3w9zzp8/DxhhPXKhlSVLFt544w02bNig\nzpOLbC8vL27evKkW/zLsxpb89ddfVp8rVdtfffWVmvwcgbw3o0aNSjLXws2bN5kwYQIAU6ZMoXfv\n3oBzfAlWrVoFGBsS+b548eK8/fbbDlH1g1ZfazQajUbjMrwQ3tft27dnzpw5aqcMkD9/fsAIgWrU\nqFGC2WTsweXLl+N5LJtz/PhxgHgOGFWrVlW7+YTy2NqKO3fusHjxYrp16wYkL3lIyZIlVaIOT09P\nu8mYEFJNJz2tJQUKFGDTpk2A/cMpkmLVqlV06tQJeBrqJjH3vv7222/VzsUKXkrv606dOvHrr7+q\nMMdffvlFee46A+msOXHiRBXF8dZbb1GwYMEEHfcaNGjA3r178fX1BWDs2LE2l0k6bI4fP97qc7/5\n5huLaAJ7s3DhQgB8fX1TlHRn8+bNfPzxx3aTLyHkGNy3b18uX76sPi9fvjxVq1YFnobipoAXP6OX\npEePHkyePFn9/6233oqXocVV2L9/P2Co26X7vbRj9OjRAzC8PG0Rn5wQTZo0YcWKFSnO6FW6dGnA\n6DAyrakjWL58OZBwykIZ47hjxw4KFizoEHkiIyMZPXq08nQ9fvy4VQOPl5eXsodbwUs1KZvTs2dP\n5s2bBxjhRy1atACMtKeOzMiXEiIiIvDx8VFyLl261OZe99HR0YARayt/g4kh+/Nrr72m+o9UF9sT\n80nZnAwZMlhMtidPnuTixYsJXuPo0aPxwhAdwfXr11UKzhUrVjBt2jQVulq5cuWUZhG0rj/L0A0n\nv1LN7t27hY+Pj/Dx8RGAyJMnj8iTJ484fvy4LS5vFw4cOCAOHDggvv/+e2EymdRr4sSJdmuzUaNG\nwmQyCYyB06LdL774QvTq1Uts3bpVbN26VfTq1UvkzZtX5M2bV50jv9ekSRO7yZgUO3bsEKdOnRKr\nV68Wq1evFgMGDFAy1apVy2Fy3LlzR3h6elrcF/N76eHhIYoVKyaKFSsW79jy5cvF8uXLrWnG2f3S\naf1ZCCH++usv8ddffwl3d3d171q2bGmry9uVjh07qt/luXPn7NpWcHCw+Prrr8XXX39t8TuL22cT\nOtalSxfRpUsXcfDgQZvLFRUVJaKiokSzZs3E559/LubPny/mz58v7t69a3HegwcPxMWLF8XFixeF\nt7e3hdxTp061uVwpYfv27aJq1aqiatWqIm3atMnpw+ZY1X+0TVmj0Wg0GlfB2tnbzi+bcP36dXH9\n+nXRqFEjtTr08fGx1eXtxs2bN0WePHnUCrFnz552a+vcuXOicOHCqi03NzdRvXp1Ub16dbFnz54E\nZbt586aoU6eOcHNzs9gJBgUFiaCgILvJag23b99Wz9rb21s8ePDAru2FhISIkJAQIYQQ3333nXBz\nc1P3Rb4vXry4WLlypfpOiRIl1DE3Nze9U04mGzZsEFmzZhVZs2YVH3zwgYiOjrZ1EzanWbNmolCh\nQqJQoULxdob2IDo6WkRHR4ujR4+qV+vWrUW+fPks+npir9dee00cPnxYHD582O6yJsSFCxfEhQsX\nRP78+V1yp2wOIPz9/YW/v3+yv2rN64UJiQLIkycPYMQ7Shvkw4cPiYmJIU2aNM4ULUn27t1LWFiY\nQ9p68uQJQ4cOVdlqTCYTRYsWBYzsWHGRGYBk1SrJw4cPlVOEtDM7A3Nb1MWLF4mKilI5qG3Fvn37\nAOjcubNFJa927dqp+yKEUBmoChUqZBF6cvToUWVTzpw5s0NjRF8EPv30U5XLfujQoWzZssXmeaVt\nyc2bN9m+fbvKK33+/Hm7lBc1R4ZTmttf586dy/79+zl79ixghBjJ0MJHjx5ZlH+8fv069evXBwy/\nE0eGIz158kRV/Lt69arD2k0pqS2l+yy0+lqj0Wg0GhfhhdopSz744AMVEnXmzBn279/PBx984GSp\nLNm4caPK/BUSEsKjR4946623AFTVJnswePBgVqxYYXVhCenlmVBRdVmE3pmcPHlSvff29o63o08t\nmzZtUl7ygwcPtggp8fb2TrI28ty5c+N9Vr9+fb1TTgHFixdX7/38/FxypyyzVg0ZMoTw8HDmz58P\nYPddclKUKVNGZciSBXAAtm3bxowZM5RGEZ5qnX777TeV7GbAgAF2lW/nzp0MGTJERaXExVn5p53J\nCzkp3717V6lic+fO7TIl4K5du8asWbMA+PHHH9WEB0YYl8yA44iwHhlG8ayJVWYnW7duncXnPj4+\n8Uo9OhJZ+eaXX35RnxUpUsRmqutp06YBxkQs20pOgYR9+/bRuXPneJ/rghQp46OPPgIMM8G///5r\n9/ZkucO8efMmmcZVTmQbNmygY8eO6vNSpUrx9ddf21XG1FC5cmXKli1rkWJXcv36dVUcJ6WT8saN\nG1W1u6QmVhk2lRC1atVSlZpcgaQyHtqSF2pSlru/UaNGqR1Unjx5Eq3L6whkvdU1a9Ywe/ZslYoR\nnpb969atG82bN7drrl+ZVlOujGX5wE8++SSeLTmhKlESw8/BSETgrJSbgLIxbt++XX1mS3lkjOK9\ne/eSTAZjjqw1HRAQwJgxY9SiSwihYrrtqQV5kVm0aBFg2PPsbdMDo6Y2GIk/KlSoABipXuUkIYRg\nxYoV3L17F7BMBtSyZUuLPN6uQlRUlEWN72PHjtltotm4caMq0bhz584kn1ncY9KPZeLEifFKojqL\nY8eOqWdvb78QbVPWaDQajcZFeGF2ynfu3FE2WvMi8tOmTVMrL0fKAkb2IVmYXH4mVem9evVSmW4c\nkbJS2rW+//57Ro8erXaYjRs3pnXr1oBR93TUqFFcuXIFSNjLUO6ea9WqZTdZAwICeO+99xJUj4eH\nhzN58mSV7QmgbNmyAPz88882k0H+7SaTiaVLlwKGBkH6KmTJksXCnr1jxw5VI/vEiRMW1zCXzZ4p\nVF9UTp48aWG7d0Tt3X79+gHg7+9vUVv7yJEjQPz0kJkyZVJyDR482KFjzqlTp/jtt9/U/2UBjyZN\nmrB69WoVPXD16lWlcXgWqa1lndIa54UKFVL9zZWKzUyePJkbN24Axpxiz4iT5zrNpvyxzZs3D39/\nf5WuEowwFICiRYvaRd21Y8cOwAgjevvtt5VtMzAwkMOHDwNP1ZkA+fLlo2/fvrRq1QqwT+UYa7hy\n5Qre3t5KDW1tms0MGTIwbNgwFbpgDzu9rP5UsmRJvLy8VPrMOnXqqHNmz55tkaaycuXKqhPLXMm2\nQC7wBg4cqD4TQih1Wrp06Sx+b3EHaSkbGIO0tIkmM33qS5tmE56WOx00aJByBGratCkLFy7Ezc0x\nSr6//vpLTWSRkZHK/FOtWjXefPNNFUaUN29eh6WD/OOPP5gyZQpgpO2NiYmx+C3K8Ch3d3eioqKU\nGcXacbBYsWLqfqe0ct2TJ09o164dYIzPSaWgzZIliyoLO3LkyARDM53Jli1baNSokUqzaa2TbAJY\n9dFpn6cAACAASURBVAC0+lqj0Wg0GlfB2iwjdn4lm9GjRwt3d3fh7u6uMjrJDDrbtm1LySWt5vHj\nx6JixYqiYsWKwt3dXXh4eCSYV7Z+/fri0KFD4tChQ+Lhw4d2lclaHjx4YJEjN6HsPvJYlixZhLe3\nt/D29hZjxoyxu2y3bt0St27dEhkyZFDPNLGXzG2+YsUKu8gi8/ZWqFAhwaxdCd0z+b5gwYLihx9+\nEPfu3RP37t1LjRjO7pdOy+g1ffp04enpKTw9PQUgfH19ha+vr7hz544tLv9c07BhQ5EjRw6RI0eO\nJLN0xe3PCR2TY6iPj4/YvHmz2Lx5szh06JBN5AwNDRWhoaFi8ODB6vn5+vqKJk2aKJlatGghzpw5\nY5P2bM39+/fF/fv3xfvvvy/c3NxE//79Rf/+/VNzSav6z3Orvp42bRp9+/YFDJVW8+bNlZekrTM6\nJYQsFzh06FBOnDihKjxlz55dhcKkSZPGYWq25DJp0iQARowYYaFmh6dq1z59+qiSiY7kyJEjDB06\nNMHqNxUqVKBRo0Z89tlngGGDsidXr15VponVq1crb9WMGTMqWzxgEQ6TK1cuW9kUX2r1tSZxpHf4\n2bNn+f7775UXeELIMT6uCrlEiRL07t0bQFXh0hgEBQUxevRowDBJ9u/fnxEjRgCkJppHq681Go1G\no3meeG53yhrNS4DeKWs0TqBq1arKGff777+ndOnStsh3YVV/1pOyRuO66ElZo3lx0OprjUaj0Wie\nJ/SkrNFoNBqNi6AnZY1Go9FoXAQ9KWs0Go1G4yLoSVmj0Wg0GhdBT8oajUaj0bgIelLWaDQajcZF\neGFKN7oiR44cUWUkz507x4MHDxg7dixgVJCS5Q+dVTFKo3E206ZNA4y0kbLykSyP6Wps3bqVrVu3\nAjB8+HCqVKnC0KFDAahSpYrzBANVCeqjjz7iwIEDAHh5edGgQYMEz69VqxY1a9ZMbtWyFwI5Jv/w\nww/cvHkTMFKQCiEoUqQIYKQmPX36NAArVqxQ1cAcgd4pazQajUbjIrh0Rq+ffvoJk8mkVtClSpVi\n9erVxhfM6tcWKFCAgQMH8u233zpI3KT577//AGPFL2twJkS+fPkAY+XWsGFDh8iWEGfPngWM2rHH\njx9XdaqvXbvGoEGDAKNgeo4cORwiz2+//WZRJEMIQUBAAAD169enUqVKqpD7C84Ln9Hr559/BqBL\nly6qHnapUqWYPXu26h/OpmrVqgBql2yO3CkPGzbMgRIlzs8//6z6bNxCM3Hp1q2bKkxjC/z9/dm7\nd2+CxyIjI5k3bx5gFBB68803AWNcKVy4sC1SWFrFyZMnKVq0KPB0d2z+Xs4p5u9Lly6t6kunkuc/\nzaabm1uSxbHNj6VNm5Y8efIAUKdOHdasWQNA165dadq0qUM7eEREBGCoiHLmzAkYA82hQ4e4dOkS\nAJcvXyYyMhKA3Llz888//6hByRFERUUB0LlzZ5YtWwYYi4nE7veUKVPo0qWLTWXYtm0bDx8+BGDV\nqlVs374dMO7No0eP1Hlxn3WuXLnYsmULAO+++65NZUoIKeP333+vFoWSDBkyABAQEKB+f/L5S9at\nW6fUZAAtW7YEjMXkM3jhJ2XZBxYsWKCqqwFkzZpV3SdPT0+L5//555/z3nvv2UrWJBk2bBjDhw9X\n/5dqajlBu9qkDE/79pYtWwgMDLRYTMh+Jcehfv36AYYqN7V8+OGHFpNyYtWp4h7r16+fMus5AjnO\nmEwmKlasqD7fsGGD+s3dvHkTLy8vwHjWUq2dSnSaTY1Go9FonidemJ1yUsfKli3LTz/9BED58uVT\nK6tNuH37NuPGjQPgxx9/ZP78+WqVZm8OHDigHBeuXr2Ku7s7YDic1atXjzp16gBw8OBBhgwZAth2\np/zrr78C0LNnTx48ePDM8xN61q+//joAu3fvJm/evDaRKzGWLl0KGGq3xChZsqQyVchdSGLI6yxe\nvPhZTb/wO2XJ/fv3lSp7+PDhSWpKSpYsyY4dOwDInDlzamVNEvOdshBC7TqlStsVd8pJITUTVatW\nZd++fZQoUQKAnTt34uHhkaprP3jwQJnCAgMD1S60WLFiLFmyhEqVKqljt27dAgx1u5ubG6tWrQLg\niy++SJUMyUXKMXbsWCZNmqR+ZxUrVlRzRunSpW3VnFX92aW9r/Pnz4+bW8Kb+djY2CSPSRXO7du3\n2bdvHx999BEAc+fOddjklxQ5c+akQoUK6v+HDh1yiFxz5sxh0KBByt701Vdf0atXL8BQsZuzc+dO\nu8ggbf+JLaqsQU58v/32G/3797eJXIkhTRBubm7ExsYmeM6RI0esvt6SJUsAqybll4asWbMyYMAA\nwFARm/eNuBw5ckQ9f3ubL4YNG2Yx4ZqrssH5XtfJJWPGjADKPyR79uwWn6eGzJkzK1+PuD4fXbt2\nVe+jo6PVYgYM02PWrFlT3b61yN/Ojh07GD16NACnT58mU6ZMDBw4EED96wy0+lqj0Wg0GhfBpXfK\nz1IDJsWZM2cAmDlzJpMnT1afBwcHp1ouWxAWFsaYMWPU/69du+aQdv39/cmWLRsTJkwAoEWLFvHO\nkSquDRs2OESm1LBz506775Q/+eQTAE6dOqW8wKWq+uTJkwDs3buXMmXKACjvTumMdPLkSQYPHqyu\n5+vra1d5n0eioqKUKnHgwIGYm9UyZMhAoUKFAChTpgx16tRxiINfXMzjlCXP00752rVrzJ49GzBM\nU4CKU06TJo3d25cauRkzZqi4apPJRIcOHahcubLd2wcYNWoUU6dOBQwtqrnDWaVKlWjXrp1D5EgK\nl56UbUFsbKxFB3e2DV2qORs1akRISAgA77zzjpok7c20adMoXrx4kuf4+/sDhkpd8sorr9hVLgBv\nb28AGjRoQPv27Rk1ahRgeOYmxvfff293uSRvvfWW8lZNDnFVYW3btrWVSC8MmzZtUgvmEydOYDKZ\n1ES8cOFCteBxBnHtyOaYm2D+/vtvwHUm6ocPH/Lo0SP8/PwAw5fj9u3b6niFChUYMWKE3dqXJsTx\n48ezdu1ai7AiOQ736NFDqZAdQWBgYLyEIZL169crj+uKFStSr149wDDx5cqVy2EyurSjV3LYs2cP\nV69eBaB3797qB3Hnzh2L8+bNm8fXX3+d2uZSxIIFC5Tj1OXLl5UdZ926dQl2eEezbNkyzp07p+xm\njx49ok+fPoDhjGYrpC+AyWQiffr0gPHMvvrqKwCKFCnCkSNHVKe4ePFiPPuzdEZbtGgRmTJlspls\ntmT37t2A0cGlLbpgwYJqMWbF7uSlcfQqV66cmpSfPHlCbGys6h+1atVSsbf58uVTNn5HsHXr1mT3\nTZnpy5GT8+XLlwHDZ0Q6W+3du5cLFy5YnCdD+Jo2bUqvXr2euUBPDceOHQPi25fh6aTs4+ND9erV\nlc3Z3qGrp06dUiGO5pw4cYJdu3YpTdjNmzct4pTXr19vi9+dDonSaDQajeZ54oXYKUdERFC/fn2V\nUCKpcKmYmJjUNJVsZHav8ePHM3LkSLVjypEjB7t27QKgcOHCDpUpLh07dgQM+7v5fStcuDDbtm0D\nsKn6RuY7HjVqlFLlSlW1pHbt2mzcuBFI+HnKlbUtMxJZQ1hYGPD0d+Tp6QlgkZEoMjKS2bNnK7Wc\ntJUCNG7cWIVYWcFLs1OuVasWmzZtSvhiZs8/Q4YM9O/f38J7154kljwkrg00rlc2OEadvXPnTsaM\nGaNsxOZJaqQWSvpcNG3aVNmQpWnAnjx58gSA+fPnc/78eZXR6+7du8rr+969ezx69Eh5X7ds2dLh\nfTohtm/frhIFLVy4kNu3byt787fffpvS5DXPf0Yva9mzZ48KeYKkJ+XJkyer0KP06dMrdY69kAnh\nZRxeo0aNAMOW8uGHH9q1bWuR9uw+ffpY3LcGDRowf/58wP7xoHGpXbu2cjRL6HkmlC2oYcOGKjuZ\nPThz5oyybd6/fx94OjjXrVtXDSxTpkxJ1KHwypUryVHRvTSTcpcuXZgxYwZghOe0bt2aJk2aAMYC\n9ty5cwCMHj2aEydO8NlnnwGOCSuTIVFVqlRJcoKV523bts3CIezvv/+2+cQ8fvx4AAYPHqycpsAo\nSNGmTRsAWrVqZdM2bcWmTZuoUaMGYNyr9evXK7+Rmzdv0r17dwAVJ+xsgoKC6N27t8oE5uXlpXI2\nJNOnRauvNRqNRqN5rhBCuMIrVezevVu4ubmpl8lksvh/3GNVq1YVVatWFc2aNROHDx8Whw8fTq0I\nieLj4yN8fHwExu5BbNmyRWzZssVu7aWG48ePi8DAQFG2bFlRtmxZYTKZxNKlS8XSpUsdLkufPn2S\nfJ4mkynBz9966y2xfv16sX79epvLNHz4cPUck/MqXLiwOHTokDh06JCIiYlJTpPO7pcO7c/BwcEi\nODj4mef9+uuvwt3dXbi7u4smTZqktDm78ffff4sqVaqo51+lShWbt1GtWjVRrVo11Q/kq3379iIs\nLEyEhYXZvE17smrVKrFq1Srh5uamnu2+ffucLZYFI0eOFCNHjhQeHh7/x955h0V1PX38u9iwAhGx\nRcUoKBqNxhITxZ/EirGBWKMJxq7RWGKNNSQmkNh7jD1RFFHsBDWWYK9JbChqFBWDsdCbcN4/7nuG\nXVhgF7aB83mefWTrHXfvuXPOnJnv0G87Y8YMfT5Cp/FTKMLXgJLq3r17d63Pbdy4kcptXr58iR07\ndgBQMnflnuDhw4cNKadGyP0cmb0s9x5HjhxJCkZVqlQx+HHzg9yXUm+QYerzJD4+HuPHjwegZJTq\nEr6Wj0u7O3bsSPtT8nfODw8ePMCgQYMAgPIXckKec1evXs1r+P+1CV/ri6z7XrRoEUluNmrUyNiH\n1ZnMWduG3l+W+51ffPEFIiIiNJ6T1xg3Nzf4+fkVqI5qW7duRf/+/QEoJYiXLl3Kt/ynoZk3bx5+\n+eUXAIoSmLRXlpLmgG7jWVfvbeSbSUlISBAJCQliyJAhtMJauHChUY/l4eEhatSoobGCqlSpkqhU\nqZIIDg42yrHzSnJyskhOThZubm40A9+5c6fZ7Fm6dKmoWLGiqFixYq4r5cyPLV26VCxdutRgtiQl\nJYmkpCSxc+dO4eXlJbp165bl1rBhQwFAlCtXTpQrV04cOnQor4cz97i02PG8fPlysXz5cqFSqUS/\nfv1Ev3799I1CGB31sT579mwxe/Zsgx/j3r17YvPmzaJXr16iV69eWVbOlSpVEj169BA9evQQJ0+e\nNPjxjYGTk5NwcnISVlZWYs2aNeY2RytRUVEiKipKDBw4UJ9Vs07jh/eUGYZhGMZS0NV7G/lmFh4/\nfiw8PDyEh4eH0VbKksTERBEbG6t1z9Ha2lqsXLnSqMfPC4GBgTTjNuRq09AEBASIgIAAMXbsWAFA\nY6UgVxCm5Ny5cxq/7/Dhw/P6UeYelxY7ntVXyjIqEhUVZYpD6wxMsFKWpKeni/T0dHH9+nUxYMAA\nMWDAAFG5cmWNsVCiRAmyIyEhwWi25Jf169eL9evXCysrKzF37lxzm5MjT58+FS4uLsLFxUVYWVmJ\n69ev5/RyncZPgZXZfPnypUH2CW1sbAxgTe7I9ohSZnPcuHG0z5SUlITvv/8eI0aMMIktuSHb5kmN\nWEtH7tdu3rwZKpVKY585MDDQ5PYIYRF5GoUaqRbFKMhz3sXFhfY2o6OjsW7dOtIFuHfvHslqtmjR\nAp06dTKPsbnQtGlTc5ugM/b29ti0aRMApUXwJ598oiEnmhc4fM0wDMMwFkKBWynv3r0bgKIAdfjw\nYQD5W+3KTlTq/T7zi9RW1abJLJuKBwYGUpF/UFAQ7t+/j8jISABA5cqVDWZLXpB9lKWaFwDKMLQU\n1q5dC0D5HqWakewRrY4UmDcFp0+fBgB06dIFAChrVOp0M1l5/vw5gIz+vtkhf9tdu3Zhz549lH0s\nhEC7du0AwKKydDN3kzIHNjY2GDFiBK2iZZcmc7Bu3ToS2qlVq5bZ7DAG8vvNT394dQqUU46NjaUS\nlwsXLlB5gWwwIX90IQSpr/Tt2xe3bt2i5xYsWIC9e/cCUBod/PDDDwBgsHKoO3fukLpY586dSfC9\ncuXKWLt2LVJTUwEAjx49osYEgCJ7ZypnHB0dTWUUISEh1Ibw66+/xqVLl0gtSQhBTSFyu2iaiqdP\nn+Lbb7/FkiVLAOQ+EGQjg9yQE6nIyEidLxq3b98mNSVfX19yFFJaVbZw7Ny5s06f97oxZ84c+Pv7\nA1DGh/wtvb29qRkFAKxYsYK6G12/fh1Axu9uY2ND1wT195iTzOVQbdq0IbUvUyCbU9y6dQsLFizQ\naMEqJ6mmLh978OABhg4dCiD3ckIpZSv3WC0d6WuEENmW5epDgXLKL1++pC9ApVKRlKHsZCRXzEII\nkkH08/NDYmIiPRcREUED2t7e3uBdSQICAvDkyRMAyuxQF8qWLYtVq1YZ1I7sGDNmDI4ePUqyhSNH\njiTt60uXLmHq1KkavU4za1Kbg169emXZG85usKo/bmtrS5GJ3JAdqk6cOIHLly/TBCkxMZEcBwD6\nbrZu3Yrz58+Tvm9mWrZsqY/G9WuFdLC+vr6Uv3Dr1i0al+oRGiCrzGq5cuXod96wYYPJ8kLc3Nxo\nci+drFwRHzt2jOzOvEo2tE53SkoKTe7Xr1+P5ORkqpuNj4+nqIK65jqg6IbL6GKlSpUMalNuqFQq\n+t0vXbqU4yJIRuUy54cYA+lPbt68meU5T09PAMixO5R6f2aVSmWQVrK8p8wwDMMwFkKBUvSaPHky\nNU/IPHvW+LAcnqtcuTJ69OgBABgxYgTefvvtvNibLZMmTSKx+Jzw8vIiVSIHBwejz1zlqn3w4MFQ\nqVR47733ACiqV9euXQMA7Nu3D8nJyTQz3LNnD2VCqndBMjVWVlZ6KXqNGjUKgHK+VK9eXadjGGJG\n7uzsDED5TidOnIgaNWrk9yMLpaKXjDa0bduW9uH1Gc/btm1D48aNAZh2f1Lfc8RY19aJEydi4cKF\nOr9ebp+sXbtWQ6XPlDx79gzu7u4AlC0IGd3s0aMHqlSpgsePHwNQcoZkxy2VSoXvvvsOkydPNppd\nLi4uABRlLvXzLPPfLi4u1M0vKChI4/ojc4c8PT0pEzsbCl+XqODgYPTr1w+Asi+qyyAuUaKExokY\nFBRkVNm51NRU2jPZvHkznWyyfEt2F2ndurVJHZ1sfN6mTRuyKTOlSpVC//79MW7cOABAvXr1TGZf\nTkyfPp0uQjLcqT4oZIs6R0dHLFy4EK1btwagPdEuO+Qeuz4X3l9++YXCiG5ubnRelS1bVufPyIVC\n6ZQlDx8+xKlTp+i+3BO2s7PD4MGDqSNXt27dNCbPb775JnXkMiWZ94ozox6mNuYecmBgIIVM4+Pj\ncfHiRQwYMACAkuwmu2vJ9ogyr8XYoeDcuHLlCgDl2ifzLrTZJMdt//79sWTJEqN28pMLo3nz5mHY\nsGHYtWsXAOX6IsPXx48fJ6ctbZZ/16tXDz4+PgBA+Tc5wF2iGIZhGKYgUaBWykBGEoibm1uWWZbM\nfJMrJUAJV8uZI6OILqxevRrnzp0DAJw/fx59+/YFAPTu3ZtC+5ZGnTp1AGSs+OV5O2vWLGrYLlcL\nhYhCvVJmXk/u3LlDGfOAkqwmqzu6d+9OkbrCVjqFwhi+ZpjXDHbKDFN44PA1wzAMwxQk2CkzDMMw\njIXATplhGIZhLAR2ygzDMAxjIbBTZhiGYRgLgZ0ywzAMw1gI7JQZhmEYo7JgwQJYWVnBysoKvr6+\n5jbHomGnzDAMwzAWQoFq3cgwDMMUPJydnVG6dGkAii647DXepUsXc5plkRRYRa/Y2FjqIQoo4RHZ\nI1hbxxnZvcNYUoy3b98GoDTNuHjxIgCgQoUKqFq1KgBFjD0yMhIhISEAAHd3d4wYMQKAIrjPMFoo\nFIpeshGBk5MTXZgLCp07d8agQYMAKH29LZFLly7h7NmzAJRuTLLJgkQ28WnVqhVJDpcvX960RgLU\nPS82NhZVqlQBoFz7ZO/y14DCI7MpG8l//fXX2LNnDwClW1BYWJj2D9PilGVXmYULF8Lb2zu/9mbh\nww8/BAAcPXpU5/fIrjgzZszAxIkTjdoNRRcSExMRERGBM2fOAAAuXLhAz508eRKXLl3Cxx9/DABY\nvHhxnge2bN2XkpJCXYKqVaumMckCQJObkJAQai7/wQcfoHPnztR6slixYnmyIb+sWrWKWkRKsmsn\nWbt2bZqMOTo66nOYQuGU5ffRoEEDtG/fniah8je1ZJYsWYJJkyYBUMZ4kyZNACj/l6ZNm5pNnzk6\nOhoAMH78eBw8eBD//vtvru8RQpDO/datW41qnzYePnwIQLnuyYlDkyZNMHjwYJPbkpkNGzZgy5Yt\nOHToULavad++PQBgx44dee1SxjKbDMMwDFOQsPiVclhYGGbNmgVAmaFow8bGRvPD1FbKiYmJ1IMX\nAKpXr4579+7l2+DMyFXj8+fP6bHSpUtTb1AvLy8AQExMDADl/yJXjIDSz3PatGkGtys3Hj9+TI3m\nf/zxRwqD5caYMWOwePFivY+3d+9e+j3//PNPnd+XeRXaqVMnAEqv5ebNmwMA9VU2JnKVFxISQr2U\ns7NRHWdnZwDA/v378dZbb+l6uEKxUp4+fToApRvQv//+S33Es/u9rKysMHToUGpA7+XlRf3IzYE8\nX3/66Se8fPkSgBLlKVeuHDp37gxAWTnL8VyqVClMnjzZqDbJMevm5qZxfcsJIQT1lv/111/Rtm1b\no9lXEDh//jz1Qv7jjz/g7u6Onj17AoBG/24hBIYPH44//vgDABAaGooPPvggL4csHOHr0NBQrWGu\n3r17U+hoxowZsLa21vr+AQMGaIRqhg0bhpUrV+bX3izs3r0bADQGiKenJ4oUKaL19atWrcLIkSPp\n/oQJEzB//nyD26WNpKQkfP311wCAtWvX4unTp/RckSJFNGyW4a7y5ctjz549tG/v6OiIu3fv6n1s\nNzc3ar+pjrW1NapVq5bt++R5mpaWlmVSNWbMGACAn5+f0bcAOnToAAA4cuRItjbm1Ex+586d1GJU\nBwqFU5ZERkbi9OnT8Pf3B6BM0KSzdXV1pXMrPT1dY8JWp04dbNu2DQDQsGFDoxqujevXrwMAypQp\ngxMnTgBQxs3x48e1/uZlypTB33//jRo1ahjNpp9//hkAsHz5cp0nt+qLlT59+pglhG0JyDB648aN\n6Zozbtw4fPLJJxqve/bsGQDg888/x7Zt29CyZUsAyrVetprUEw5fMwzDMExBwuJLot544w107NgR\nAPDbb7/R440bN842RLRv3z58++23AIBr164BAIVtjJVUoOvqRyanqRfQlyxZ0ijJZ9mxaNEifP/9\n93TfwcEBgBKCmz59Otzc3LK856+//sLChQvpvr29fZ6O7enpifT0dAAZK1z5eW3atMn1/YmJidi8\neTOmTp0KAHj58iWWLl0KABg0aBAaNWqUJ7vyQqlSpWjlDChbEOrIco+8RBQKI5UrV4anpyc8PT0B\nKCsRGcq2sbFBYmIivfbevXs07sPCwihsbA7q1atHf8vqjRcvXmhEfCpUqED2lihRgratjIW8nslV\ncrt27QAAVapUoZBsZj766CNcvXoVAHTepjI2V65cQbdu3WisrFixwujHlL/N5MmTaRusQYMGADKS\n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\n/5oj8GDDTAv3AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb69c1a58>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# more on analyzing individual errors\n",
    "\n",
    "# EXTRA\n",
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "cl_a, cl_b = 3, 5\n",
    "\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223); plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()\n",
    "\n",
    "# shows difficulty in seeing difference between threes and fives.\n",
    "# We used SGDclassifier, which is sensitive to image shifts/rotates."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### MultiLabel Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "large nums?\n",
      " [False False  True ..., False False False]\n",
      "odd nums?\n",
      " [False False  True ..., False False False]\n",
      "combined (multilabel)?\n",
      " [[False False]\n",
      " [False False]\n",
      " [ True  True]\n",
      " ..., \n",
      " [False False]\n",
      " [False False]\n",
      " [False False]]\n",
      "KNN prediction of some_digit: (>=7? odd?)\n",
      " [[False  True]]\n"
     ]
    }
   ],
   "source": [
    "# use case: returning multiple classes for each instance\n",
    "# (example: multiple people's faces in one picture.)\n",
    "\n",
    "# create y_multilabel array with 2 target labels for each digit image:\n",
    "# first = large digit (7,8,9)?; second = odd (1,3,5,7,9)?\n",
    "\n",
    "\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= 7)\n",
    "y_train_odd = (y_train % 2 == 1)\n",
    "\n",
    "print(\"large nums?\\n\",y_train_large)\n",
    "print(\"odd nums?\\n\",y_train_odd)\n",
    "\n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "\n",
    "print(\"combined (multilabel)?\\n\",y_multilabel)\n",
    "\n",
    "# KNeighbors classifier supports multilabeling\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)\n",
    "\n",
    "# make example prediction using \"some_digit\" from above\n",
    "# >= 7 = false (correct); odd digit = true (correct)\n",
    "\n",
    "print(\"KNN prediction of some_digit: (>=7? odd?)\\n\",knn_clf.predict([some_digit]))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.968186511757\n"
     ]
    }
   ],
   "source": [
    "# another example: find avg F1 score across all labels\n",
    "\n",
    "y_train_knn_pred = cross_val_predict(knn_clf, X_train, y_train, cv=3)\n",
    "\n",
    "print(f1_score(\n",
    "    y_train, \n",
    "    y_train_knn_pred, \n",
    "    average=\"macro\")) # use \"weighted\" if more weight to be given to more common labels."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### MultiOutput Classification"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# generalization of multilabel, where each label can have multiple values.\n",
    "# example: build image noise removal system\n",
    "\n",
    "# start by adding noise to MNIST dataset\n",
    "\n",
    "import numpy.random as rnd\n",
    "\n",
    "noise = rnd.randint(0, 100, (len(X_train), 784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = rnd.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod = X_test + noise\n",
    "\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test\n",
    "\n",
    "some_index = 5500"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_digit(data):\n",
    "    image = data.reshape(28, 28)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary,\n",
    "               interpolation=\"nearest\")\n",
    "    plt.axis(\"off\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAABU1JREFUeJzt3a9vFVkYgOF7N8XV4GgIkCBQYAgOi0KQVKAQkJCQYEn6\nH+AQBEeCAYdC4lAoRBVcDQhAQiBgKrpikzWbOXT74xZ4n8d+nc4RfXPE6czMt7e3Z0DPX4e9AOBw\niB+ixA9R4oco8UOU+CFK/BAlfogSP0StLPl+/p0QDt58Jz9k54co8UOU+CFK/BAlfogSP0SJH6LE\nD1HihyjxQ5T4IUr8ECV+iBI/RIkfosQPUeKHKPFDlPghSvwQJX6IEj9EiR+ixA9R4oco8UOU+CFK\n/BAlfogSP0SJH6LED1HihyjxQ5T4IUr8ECV+iBI/RIkfosQPUeKHKPFDlPghSvwQJX6IEj9EiR+i\nxA9R4oco8UOU+CFK/BAlfohaOewFwJ9oa2trOD9y5MiSVjLNzg9R4oco8UOU+CFK/BAlfogSP0Q5\n5497//79cL5YLIbzkydPDuenTp2anH3//n147dra2nB+79694Xxzc3Ny9vTp0+G16+vrw/mPHz+G\n8+vXrw/nd+7cmZx9+vRpeO1+sfNDlPghSvwQJX6IEj9EiR+ixA9R8+3t7WXeb6k3q5jP54e9hJwl\nd/N/7egPws4PUeKHKPFDlPghSvwQJX6IEj9EeZ7/N/Dw4cPDXsKkjY2N4fzcuXMHdu+LFy8O56dP\nnz6we/8J7PwQJX6IEj9EiR+ixA9R4oco8UOU5/l/AaP3y89ms9mFCxd2/bt/9p34lRX/6vEH8jw/\nME38ECV+iBI/RIkfosQPUc55luD169fD+V6O8maz2ezx48eTM0d5TLHzQ5T4IUr8ECV+iBI/RIkf\nosQPUR7pXYJHjx4N57du3Tqwe//in5LmYHikF5gmfogSP0SJH6LED1HihyjxQ5Rz/iWYz3d07Hog\n7t+/P5xfvnx5OD9z5sx+LoflcM4PTBM/RIkfosQPUeKHKPFDlPghyjn/L+DLly/D+fPnz4fza9eu\n7frei8ViOL958+ZwfvXq1eF89K6C1dXV4bXsmnN+YJr4IUr8ECV+iBI/RIkfosQPUc75GXry5Mlw\nfuPGjeF8fX19cvbs2bPdLImfc84PTBM/RIkfosQPUeKHKPFDlKM+ht68eTOcX7lyZTh/+/bt5Gxz\nc3N47fnz54dzJjnqA6aJH6LED1HihyjxQ5T4IUr8EOWcnz35+PHjcH78+PFdX7u2trarNeGcHxgQ\nP0SJH6LED1HihyjxQ5T4IWrlsBfA7+3Vq1fD+bFjxyZnzvEPl50fosQPUeKHKPFDlPghSvwQJX6I\ncs7P0OfPn4fzu3fvDue3b9/ez+Wwj+z8ECV+iBI/RIkfosQPUeKHKK/uZmg+39FboCct+e+Lf3h1\nNzBN/BAlfogSP0SJH6LED1HihyiP9C7B2bNnh/MHDx4M5+/evRvOT5w48X+X9K8XL17s+trZbDZ7\n+fLlnq7n8Nj5IUr8ECV+iBI/RIkfosQPUeKHKOf8S7BYLIbzS5cuLWkl/7WxsTGcf/v2bThfXV3d\nz+WwRHZ+iBI/RIkfosQPUeKHKPFDlPghyjn/Evzs3fVbW1vD+devX4fzDx8+TM6OHj06vHYv7wLg\n92bnhyjxQ5T4IUr8ECV+iBI/RIkfouZL/n66j7XDwZvv5Ifs/BAlfogSP0SJH6LED1HihyjxQ5T4\nIUr8ECV+iBI/RIkfosQPUeKHKPFDlPghSvwQJX6IEj9EiR+ixA9R4oeoZX+ie0evFAYOnp0fosQP\nUeKHKPFDlPghSvwQJX6IEj9EiR+ixA9R4oco8UOU+CFK/BAlfogSP0SJH6LED1HihyjxQ5T4IUr8\nECV+iPob3byufrwOPwwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb41df6a0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# train classifier, and clean up the image\n",
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])\n",
    "\n",
    "plot_digit(clean_digit)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAC7CAYAAAB1qmWGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEjBJREFUeJzt3U1QFdT/x/GvAoLhFXxEEUFEFB9S8zEfG5umacZNZZta\n1aZmKmeaNk1lG2uaFk3unHTXwzRNi2pTNkNZapIpPhQooAKBQgiIiaAgiv/t7zffzxkvqff399z3\na/mZ7+VeLrdvdzznfM+oW7duGQDg/jf6f/0CAAB3Bw0dACJBQweASNDQASASNHQAiAQNHQAiQUMH\ngEjQ0AEgEjR0AIgEDR0AIpGZyidrb293cwb6+vpk7fnz5102ZcoUWdvf3++yiooKWXvmzBmXjR07\nVtb29vYm/XN7enpcVlJSImv37t3rsqlTp7osOztbPl69hps3b8rajo4Ol+Xn58vaqqoql40erf+f\nX15e7rKZM2fK2vb2dpcNDQ0lXTswMCBrV69e7bJEIjFKFt97zNDAvXbbzzbf0AEgEjR0AIgEDR0A\nIjEqleNzW1pa3JM1NzfL2lmzZrmss7NT1q5atcplP/zwg6xdvHixy1pbW2VtYWFh0q9B/ftxU1OT\nrF24cKHLamtrXVZUVCQfX1dX57KcnBxZq/LLly/LWvVv9qHXoP5tffz48bK2pqbGZdOmTZO1586d\nS7q2q6vLZY8++ij/ho5Y8W/oAJAuaOgAEAkaOgBEgoYOAJGgoQNAJFJ9UtRlN27ckLXqlGXodGF1\ndbXLQic6r1275rLh4WFZ29DQ4DK1Q8VM7365cuWKrFW7M1asWOGytrY2+Xi162NwcFDWrly50mX7\n9++Xtep9SCQSsraxsdFlBQUFsla9NvVZMDN77LHHXKZOu5qZjRkzRuZAuuIbOgBEgoYOAJGgoQNA\nJGjoABCJlB797+7udk+mjnqbmanXNW/evKSfKysrS+YHDx50mRodYGZ2+vRpl82ePVvWHjp0yGVq\nxKyZXtS8cOGCyyZOnCgf393dLXNFjQAOjblVY4TVmAEzs+LiYpfl5ubKWjX+9vjx47JWjWbIy8tL\n+ufm5eVx9B+x4ug/AKQLGjoARIKGDgCRoKEDQCRo6AAQiZTucqmsrHRPtmnTJlmrdn2oi5TN9BH9\n0E6OzEw/7SAjI0PWqosgJkyYIGvVbpDQz1VjAkKXQyhq90to983vv//uMrXzxUxfuqwu1TYzKysr\n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\nPpy3wDHB6AAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1eb40a7c88>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "\n",
    "plt.subplot(121); plot_digit(X_test_mod[some_index])\n",
    "plt.subplot(122); plot_digit(y_test_mod[some_index])\n",
    "#save_fig(\"noisy_digit_example_plot\")\n",
    "plt.show()\n",
    "\n",
    "# left: noisy image; right: cleaned up"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [Root]",
   "language": "python",
   "name": "Python [Root]"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
